zoukankan      html  css  js  c++  java
  • python模块之re模块和正则表达式

    一.  re模块


    • re模块下的常用方法


      • 额外:
        • 几乎所有的re模块下的方法都带有flags参数,flags表示匹配模式,大概有:
          • re.I(re.IGNORECASE): 忽略大小写
          • re.M(MULTILINE): 多行模式,改变’^’和’$’的行为 
          • re.S(DOTALL): 点任意匹配模式,改变’.’的行为 
          • re.L(LOCALE): 使预定字符类 w W  B s S 取决于当前区域设定 
          • re.U(UNICODE): 使预定字符类 w W  B s S d D 取决于unicode定义的字符属性 
          • re.X(VERBOSE): 详细模式。这个模式下正则表达式可以是多行,忽略空白字符,并可以加入注释  
    •  re.findall(pattern, string, flags=0) 功能是根据pattern 筛选出string中所有匹配的内容。返回值是一个列表。
    # 正常匹配
    s = "zhangsan lisi wanger mazi"
    ret = re.findall('an', s,)  # 返回匹配的内容
    print(ret) # 列表 :['an', 'an', 'an']
    
    # flags
    s = "zhAngsan lisi wAnger mazi"
    ret = re.findall('an', s, re.I)
    print(ret) # ['An', 'an', 'An']
    # findall优先级:
    
    import re
    
    ret = re.findall('www.(baidu|oldboy).com', 'www.oldboy.com')
    print(ret)  # ['oldboy']     这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可
    
    ret = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com')
    print(ret)  # ['www.oldboy.com']
    • re.match(pattern, string, flags=0) 功能: 与search作用一致, 但是它是在字符串起始处开始匹配,倒是和startswith比较像, 返回值是一个对象 .需要 .group() 来获取值。 注意:如果没有匹配的内容则返回None
    s = "zhangsan lisi wAnger mazi"
    ret = re.match('zh', s) # 返回值,<_sre.SRE_Match object; span=(0, 2), match='zh'>
    print(ret.group())
    
    s = "zhangsan lisi wAnger mazi"
    ret = re.match('an', s)
    print(ret)   # None
    print(ret.group()) # 报错
    • re.subn(pattern, repl, string, count=0, flags=0)   替换,替换匹配成功的内容。 返回值是一个元组,(string, 替换次数)
    • re.sub(pattern, repl, string, count=0, flags=0)  与subn作用一致, 只是返回值不同,sub返回值是字符串
    # subn
    s = "zhAngsan lisi wAnger mazi"
    ret = re.subn('A', 'a', s, 1) #  1- count 指定替换次数
    print(ret)  # ('zhangsan lisi wanger mazi', 2)
    
    
    s = "zhAngsan lisi wAnger mazi"
    def demo():
        return 'a'
    
    ret = re.subn('A', demo(), s) # repl 可以用函数返回值
    print(ret)  # ('zhangsan lisi wanger mazi', 2)
    
    # sub
    s = "zhAngsan lisi wAnger mazi"
    
    def demo():
        return 'an'
    
    print(re.sub('An', demo(), s, 1))   # zhangsan lisi wAnger mazi
    • re.complie(pattern, flags=0)  功能: 与内置函数complie很像, 将正则表达式规则编译成一个正则表达式对象
    obj = re.compile('d{3}')  #将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个数字
    ret = obj.search('abc123eeee') #正则表达式对象调用search,参数为待匹配的字符串
    print(ret.group())  #结果 : 123
    • re.finditer(pattern, string, flags=0) 功能: 根据pattern筛选所有的匹配内容。与findall作用很相似,只是返回值不同,finditer返回值是一个迭代器。
    s = "zhangsan lisi wanger mazi"
    ret = re.finditer('an', s)
    print(ret)  # <callable_iterator object at 0x028A85B0>
    
    # print(next(ret))  # <_sre.SRE_Match object; span=(2, 4), match='an'>
    
    print(next(ret).group())  # an next后 .group()
    
    for itr in ret:
        print(itr.group())  # an an
    • re.search(pattern, string, flags=0) 功能: 根据pattern 筛选出string中第一个匹配项,并返回。 返回值:如果能找到匹配项,返回值是一个对象;如果找不到匹配项,返回值是None
    s = "zhangsan lisi wanger mazi"
    print(re.search('an', s).group())  # an
    • re.split(pattern, string, maxsplit=0, flags=0) 功能:根据pattern 分割string 。 返回值是列表。
    s = "zhangsan|lisi|wanger|mazi"
    ret = re.split(r'|', s)
    print(ret)  # ['zhangsan', 'lisi', 'wanger', 'mazi']
    
    ret = re.split(r'|', s, 1)  # maxsplit=1,指定分割次数
    print(ret)  # ['zhangsan', 'lisi|wanger|mazi']
    # re.split()优先级:
    
    s = "zhangsan|lisi|wanger|mazi"
    ret1 = re.split(r'|', s)
    print(ret1)  # ['zhangsan', 'lisi', 'wanger', 'mazi'] 没有保留用来分割的匹配项。
    
    ret2 = re.split(r'(|)', s)
    print(ret2)  # ['zhangsan', '|', 'lisi', '|', 'wanger', '|', 'mazi']
    
    # 匹配规则加括号,可以保留用来分割的匹配项。

    二. 正则表达式


    • 元字符
      • # .(点)    匹配除换行符以外的任意字符
        # w        匹配字母或数字或下划线
        # s        匹配任意的空白符
        # d        匹配数字
        # W        匹配非字母或数字或下划线
        # S        匹配非空白字符
        # D        匹配任意非数字
        # 
                匹配一个换行符
        # 	        匹配一个制表符
        #         匹配一个单词的结尾
        # ^         匹配字符串的开始
        # $         匹配字符串的结尾
        # a|b       匹配a或b
        # (..)      匹配括号内的表达式,也表示一个组
        # [..]      匹配字符组中的字符
        # [^..]     匹配非字符组中的字符
    • 量词
      • # *      重复零次或更多次
        # +      重复一次或更多次
        # ?     重复零次或一次
        # {n}    重复n次
        # {n, }  重复n次或更多次
        # {n,m}  重复n到m次
    • 贪婪匹配,非贪婪匹配
      • 如上量词默认都是贪婪匹配
      • 非贪婪匹配:  在量词后面加上? 即可改变成非贪婪模式
        • # *?        重复任意次,但尽可能少重复
          # +?        重复1次或更多次,但尽可能少重复
          # ??        重复0次或1次,但尽可能少重复
          # {n,m}?    重复n到m次,但尽可能少重复
          # {n,}?     重复n次以上,但尽可能少重复
      • .*? 的用法
        • . 是任意字符
          * 是取 0 至 无限长度
          ? 是非贪婪模式。
          何在一起就是 取尽量少的任意字符,一般不会这么单独写,他大多用在:
          .*?x
          
          就是取前面任意长度的字符,直到一个x出现
    • 转义符
      •  转移具有特殊意义的字符
    • ?的用法:
        • 量词 : 量词:  代表重复零次或者1次
          findall优先级: (?:) 可以取消优先级
          非贪婪模式:  在贪婪模式的量词后面加?  可以改为非贪婪模式
          定义组名(..) : 在(?P<组名>)可以定义组名
  • 相关阅读:
    问题解决(2)
    问题解决(1)
    ubuntu16.04spyder闪退
    ubuntu16.04安装caffe
    python做批量剪切、旋转等小程序
    html中如何使得改变背景的透明度时,背景上的文字透明度不被改变
    css下拉菜单制作
    float浮动
    css盒子模型
    css选择器,背景样式,文本属性
  • 原文地址:https://www.cnblogs.com/wangyuanming/p/7506394.html
Copyright © 2011-2022 走看看