zoukankan      html  css  js  c++  java
  • python3.x 正则表达式的应用

      正则表达式是我认为比较难的一个东西,今天忽然又学到了这个,想到写下来,以后作为参考手册使用。

      python如果想使用python需要引用re方法,在文件开始进行引用。

    import re

      接下来说一下re包含的函数的用法。

      re.__all__

      返回一个包含re函数名的列表

    print(re.__all__)

      结果如下:

    ['match', 'fullmatch', 'search', 'sub', 'subn', 'split', 'findall', 'finditer', 'compile', 'purge', 'template', 'escape', 'error', 'A', 'I', 'L', 'M', 'S', 'X', 'U', 'ASCII', 'IGNORECASE', 'LOCALE', 'MULTILINE', 'DOTALL', 'VERBOSE', 'UNICODE']

      re.__version__

      返回re的版本

    print(re.__version__)

      结果如下:

    2.2.1

      match(pattern, string, flags=0)

      判断pattern是否在string开始位置,如果有,返回匹配的对象,否则返回None

      (为了演示方便以及照顾不是特别了解正则表达式的童鞋,这里使用简单的字符串匹配来观察效果,具体的正则表达式写法下章会说明。flags是一个标志变量,文章最后会进行说明,默认为0,没有效果,其他的方法相同。)

      能匹配上时:

    source='qq14717287xx@qq.com'
    item='qq1'
    res=re.match(item,source)
    if res:
        print(res)
        print(res.group())
    else:
        print(res)
        print('No match!')

      结果如下:

    <_sre.SRE_Match object; span=(0, 3), match='qq1'>
    qq1

      可以看到,如果只是打印es会输出匹配项,匹配多长字符,匹配的字符。

      匹配之后res有group方法,能够输出匹配了哪些字符。

      不能匹配上时:

    source='qq14717287xx@qq.com'
    item='qq2'
    res=re.match(item,source)
    if res:
        print(res)
        print(res.group())
    else:
        print(res)
        print('No match!')

      结果如下:

    None
    No match!

      没有匹配上的时候res没有group方法,如果使用的话会报错。

      fullmatch(pattern, string, flags=0)

      判断pattern是否是string的全部,如果是,返回匹配的对象,否则返回None

      能匹配上时:

    source='qq14717287xx@qq.com'
    item='qq14717287xx@qq.com'
    res=re.fullmatch(item,source)
    if res:
        print(res)
        print(res.group())
    else:
        print(res)
        print('No match!')

      结果如下:

    <_sre.SRE_Match object; span=(0, 19), match='qq14717287xx@qq.com'>
    qq14717287xx@qq.com

      不能匹配上时:

    source='qq14717287xx@qq.com'
    item='qq14717287'
    res=re.fullmatch(item,source)
    if res:
        print(res)
        print(res.group())
    else:
        print(res)
        print('No match!')

      结果如下:

    None
    No match!

      不是全部的字符串就不能匹配上,同样的,没有匹配上就没有group方法。

      search(pattern, string, flags=0)

      判断string里面是否包含pattern,如果有,返回匹配的对象,否则返回None

      能匹配上时:

    source='qq14717287xx@qq.com'
    item='xx'
    res=re.search(item,source)
    if res:
        print(res)
        print(res.group())
    else:
        print(res)
        print('No match!')

      结果如下:

    <_sre.SRE_Match object; span=(10, 12), match='xx'>
    xx

      不能匹配上时:

    source='qq14717287xx@qq.com'
    item='xz'
    res=re.search(item,source)
    if res:
        print(res)
        print(res.group())
    else:
        print(res)
        print('No match!')

      结果如下:

    None
    No match!

      与match函数相同,如果不能匹配上时就没有group方法,否则会报错。

      sub(pattern, repl, string, count=0, flags=0)

      判断string里面是否含有pattern,如果含有则使用repl替换,返回新字符串。不改变原有字符串。count定义替换的次数,如果不填写默认替换字符串中全部匹配的项。

      能匹配上时:

    source='qq14717287xx@qq.com&10010/10086'
    item='1'
    res=re.sub(item,'n',source,4)
    print(res)
    print(source)

      结果如下:

    qqn47n7287xx@qq.com&n00n0/10086
    qq14717287xx@qq.com&10010/10086

      可以看出,原字符串中的‘1’被替换成了‘n’四次,同时没有改变源字符串。

      不能匹配上时:

    source='qq14717287xx@qq.com&10010/10086'
    item='12'
    res=re.sub(item,'n',source,4)
    print(res)
    print(source)

      结果如下:

    qq14717287xx@qq.com&10010/10086
    qq14717287xx@qq.com&10010/10086

      由结果可以看出,此函数如果没有匹配上也不会报错。

      subn(pattern, repl, string, count=0, flags=0)

      同sub函数,但是返回一个元组,包含修改后的字符串以及修改的次数。

      能匹配上时:

    source='qq14717287xx@qq.com&10010/10086'
    item='1'
    res=re.subn(item,'n',source,4)
    print(res)
    print(source)

      结果如下:

    ('qqn47n7287xx@qq.com&n00n0/10086', 4)
    qq14717287xx@qq.com&10010/10086

      可以看到,函数返回了一个数组,包括新字符串以及修改的次数。函数并没有修改原字符串。

      不能匹配上时:

    source='qq14717287xx@qq.com&10010/10086'
    item='12'
    res=re.subn(item,'n',source,4)
    print(res)
    print(source)

      结果如下:

    ('qq14717287xx@qq.com&10010/10086', 0)
    qq14717287xx@qq.com&10010/10086

      可以看到,函数返回的修改次数为0

      split(pattern, string, maxsplit=0, flags=0)

      以pattern作为分隔符给string进行分隔,返回一个列表。maxsplit定义最多分几次,不写默认全部进行分隔。

      能够匹配上时:

    source='qq14717287xx@qq.com&10010/10086'
    item='1'
    res=re.split(item,source,4)
    print(res)
    print(source)

      结果如下:

    ['qq', '47', '7287xx@qq.com&', '00', '0/10086']
    qq14717287xx@qq.com&10010/10086

      以‘1’作为分隔符分了四次,可以看到,并没有改变原字符串。

      不能匹配时:

    source='qq14717287xx@qq.com&10010/10086'
    item='12'
    res=re.split(item,source,4)
    print(res)
    print(source)

      结果如下:

    ['qq14717287xx@qq.com&10010/10086']
    qq14717287xx@qq.com&10010/10086

      可以看到,此函数没有匹配上也不会报错。

      findall(pattern, string, flags=0)

      查找string中全部匹配pattern的项,返回一个列表

      能够匹配时:

    source='qq14717287xx@qq.com&10010/10086'
    item='100'
    res=re.findall(item,source)
    print(res)
    print(source)

      结果如下:

    ['100', '100']
    qq14717287xx@qq.com&10010/10086

      不能匹配时:

    source='qq14717287xx@qq.com&10010/10086'
    item='12'
    res=re.findall(item,source)
    print(res)
    print(source)

      结果如下:

    []
    qq14717287xx@qq.com&10010/10086

      finditer(pattern, string, flags=0)

      效果与findall相似,只不过finditer返回一个迭代器,拥有group方法(匹配的字符串)和span方法(匹配字符串的位置)

      能够匹配时:

    source='qq14717287xx@qq.com&10010/10086'
    item='100'
    res=re.finditer(item,source)
    for i in res:
        print(i.group(),i.span())
    print(res)
    print(source)

      结果如下:

    100 (20, 23)
    100 (26, 29)
    <callable_iterator object at 0x0111B4F0>
    qq14717287xx@qq.com&10010/10086

      遍历迭代器使用group方法和span方法可以得到匹配的字符和字符匹配的位置。

      不能匹配时:

    source='qq14717287xx@qq.com&10010/10086'
    item='12'
    res=re.finditer(item,source)
    for i in res:
        print(i.group(),i.span())
    print(res)
    print(source)

      结果如下:

    <callable_iterator object at 0x018FB4F0>
    qq14717287xx@qq.com&10010/10086

      可以看到,如果不匹配的话,迭代器就没有输出

      compile(pattern, flags=0)

      预编译正则表达式。以上的方法都是在进行调用的时候开始编译正则表达式,如果查找条目较多,比如说5亿个数据,每次都编译的话,效率必然会受到影响。而使用compile函数则可以预编译正则表达式,这样就不必每次都编译正则表达式,提高效率。

      用法:

    source='qq14717287xx@qq.com&10010/10086'
    res=re.compile('100')
    print(res.findall(source))
    print(source)

      结果如下:

    ['100', '100']
    qq14717287xx@qq.com&10010/10086

      purge()

      清除缓存中的正则表达式。这个,没有明白具体用法。

      template(pattern, flags=0)

      编译一个模版表达式,返回一个表达式对象。没有明白用法。

      escape(pattern)

      对字符串中的非字母数字进行转义,将字符串转义为python能够识别的正则表达式。

      用法:

    source='qq14717287xx@qq.com&10010/10086'
    print(re.escape(source))

      结果如下:

    qq14717287xx@qq.com&10010/10086

      编译标志位解释:

      编译标志位就是函数后面的flags参数,通过设置能够改变正则表达式匹配规则,具有更大的灵活性。多个标志位可以通过按位OR进行设定,如I|M被设置为I标志和M标志。

      A  ASCII  字符串模式中匹配ASCII字符类,而且是默认模式。字节模式中则是唯一可以使用的模式,不需要进行指定。

      I  IGNORECASE  匹配时忽略大小写的变化。

      L  LOCALE  影响 w, W, 和B,取决于当前的本地化设置。

      locales 是 C 语言库中的一项功能,是用来为需要考虑不同语言的编程提供帮助的。举个例子,如果你正在处理法文文本,你想用 "w+ 来匹配文字,但 "w 只匹配字符类 [A-Za-z];它并不能匹配 "é" 或 "?"。如果你的系统配置适当且本地化设置为法语,那么内部的 C 函数将告诉程序 "é" 也应该被认为是一个字母。当在编译正则表达式时使用 LOCALE 标志会得到用这些 C 函数来处理 "w 後的编译对象;这会更慢,但也会象你希望的那样可以用 "w+ 来匹配法文文本。

      M  MULTILINE  “^”只匹配每一行的开头,如果之前有换行符,则不考虑换行符之前的内容,“$”只匹配每一行的结尾,如果之后有换行符,不考虑换行符之后的内容。

      S  DOTALL  使 "." 完全匹配任何字符,包括换行;如果没有这个标志, "."只会匹配除了换行外的任何字符。

      X  VERBOSE  允许将正则表达式写为多行,忽略空白字符(字符类或者反斜杠之后的不忽略)。可以添加注释,注释使用“#”号标识(不能在字符串或者反斜杠之后)。

      U  UNICODE  仅用于兼容性。忽略字符串模式(默认),并禁止字节模式。

      用法如下(以I为例,其它标志位用法相同):

    source='QQ14717287xx@qq.com&10010/10086'
    item='qq14717287xx@QQ'
    res=re.findall(item,source,re.I)
    print(res)
    print(source)

      运行结果是:

    ['QQ14717287xx@qq']
    QQ14717287xx@qq.com&10010/10086
  • 相关阅读:
    openpyxl处理excel
    python播放声音
    python利用wave对声音数据进行处理
    线性代数相关知识
    《深度学习》笔记-卷积神经网络
    Django--知识补充
    Django--2、form表单
    Django--4、认证系统
    Django--1、MTV及基本应用
    前端--3、jQuery
  • 原文地址:https://www.cnblogs.com/cdinc/p/5789429.html
Copyright © 2011-2022 走看看