python中正则表达式的使用

551 阅读3分钟

python中正则是内置的一个包,使用的时候需要导包import re

一、简单的使用正则

  • 1、匹配数字,如果匹配成功就有返回,否则就返回none

    import re
    
    re1 = re.match('\d+', '44557575757')
    re2 = re.match('\d+', 'abc33')
    print(re1)
    print(re2)
    

二、元字符的认识

  • 1、具有特殊意义的元字符
    • \:转义字符,转义后面字符所代表的含义
    • ^:以某一个元字符开始
    • $:以某一个元字符结束
    • \n:匹配一个换行符
    • . :除了\n以外的任意字符
    • \o:NUL字符(\u0000)
    • \t:制表符(\u0009)
    • \v:垂直制表符(\u000B)
    • \f:换页符(\u000C)
    • \r:回车符(\u000D)
  • 2、代表出现次数的量词元字符
    • *:出现0到多次
    • +:出现1到多次
    • ?:出现0次或者1次(或取消捕获时候的贪婪性)
    • {n}:出现n次
    • {n,m}:出现n到m次

三、修饰符的认识

  • x|y:x或y中的一个
  • [xyz]:x或y或z中的一个
  • [^xyz]:除了xyz以外的任意一个字符
  • [a-z]:a-z之间的任何一个字符
  • [^a-z]:除了a-z之间的任何一个字符
  • \d:一个0~9之间的数字
  • \D:除了0~9之间的数字以外的任何字符
  • \b:一个边界符
  • \w:数字、字母、下划线中的任意一个字符
  • \s:匹配一个空白字符、空格
  • ():分组,把一个大正则本身划分成几个小的正则,例如:var reg = /^(\d+)zhufeng(\d+)$/;

四、几个常用的方法介绍

  • 1、compile生成正则的,不能单独使用,要和下面的方法一起使用,不用这个也可以

    • 使用语法
      • pattern : 一个字符串形式的正则表达式
      • flags : 可选,表示匹配模式,比如忽略大小写,多行模式等,具体参数为:
        • re.I 忽略大小写
        • re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境
        • re.M 多行模式
        • re.S 即为 . 并且包括换行符在内的任意字符(. 不包括换行符)
        • re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库
        • re.X 为了增加可读性,忽略空格和 # 后面的注释
    import re
    
    if __name__ == "__main__":
        print(re.match(re.compile(r'www', re.I), 'www.runoob.com'))
    
  • 2、group就是获取正则匹配的结果,不能单独使用

    import re
    
    if __name__ == "__main__":
        reg = re.match(re.compile(r'www', re.I), 'www.runoob.com')
        print(reg.group())
    
  • 3、match从开头匹配

    print(re.match('www', 'www.runoob.com'))
    # 忽视大小写
    print(re.match('wwW', 'www.runoob.com', re.IGNORECASE))
    
  • 4、search查找字符中的数据,返回第一个匹配成功的

    import re
    
    if __name__ == "__main__":
        print(re.search('www', 'www.runoob.com', re.MULTILINE))
        print(re.search('com', 'www.runoob.com', re.MULTILINE))
    
  • 5、findall在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表

    语法:正则.findall(匹配的字符串,[开始位置],[结束位置])

    import re
    
    print(re.compile(r'\d+').findall('jhkjhkkh12jkjk32h2jj4j345jj333'))
    # 返回的:['12', '32', '2', '4', '345', '333']
    print(re.compile(r'[a-z]+', re.IGNORECASE).findall('jhkjhkkh12jkjk32h2jj4j345jj333ASS'))
    # 返回的:['jhkjhkkh', 'jkjk', 'h', 'jj', 'j', 'jj', 'ASS']       
    
  • 6、finditerfindall类似,只是返回的是一个迭代器(需要遍历)

    import re
    
    res = re.finditer(re.compile('[a-z]+', re.IGNORECASE), 'jhkjhkkh12jkjk32h2jj4j345jj333ASS')
    for item in res:
        print(item.group())
    
  • 7、sub查找与替换(类似javascript中的replace)

    • 使用语法

      re.sub(pattern, repl, string, count=0, flags=0)
      
      • pattern : 正则中的模式字符串。
      • repl : 替换的字符串,也可为一个函数。
      • string : 要被查找替换的原始字符串。
      • count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
    import re
    
    if __name__ == "__main__":
        mobile = '2004-959-559'
        print(re.sub(re.compile('\D+'), '#', mobile))
    
  • 8、split方法按照能够匹配的子串将字符串分割后返回列表

    import re
    
    if __name__ == "__main__":
        str = '深圳7.22首次线下大课:分期乐创始人肖文杰《增长黑客:双S曲线APP连续自App然生长》今天12点将于混沌大学app开始现场报名。首次大课,不容错过!如有疑问,咨询18069818935。回TD退订【混沌大学深圳分社】'
        print(re.split(re.compile(r'深圳'), str))
        print(re.split(re.compile(r'(深圳)'), str))