python:正则语法

ernestwang 840 0

正则语法

  • 单个字符
    普通字符:就是一对一的完整匹配
    []:匹配指定范围内的任意一个字符
    [abc]:任意一个字符
        [0-9]:所有的数字
        [a-zA-Z]:所有的字母
        [^0-9]:除了数字以外的字符
    \d:数字字符,等价于[0-9]
    \D:非数字字符,等价于[^0-9]
    \w:所有的字(数字、下划线、字母汉字等)
    \W:非字
    \s:匹配空白字符(空格、\n、\t、\r)
    \S:非空白字符
    \b:词边界(开头、结尾、空格、标点)
    \B:非词边界
    . :匹配除\n以外的任意字符
  • 次数限定
    格式 说明
    {m} m次
    {m, n} m~n次
    {m,} 至少m次
    {,m} 至多m次
    ? 至多一次
    + 至少一次
    * 任意次数
  • 边界判断
    • ^:以指定的内容开头
    • $:以指定的内容结尾
    • 示例:
    import re
    
    # ^:以指定内容开头
    # c = re.compile(r'^hello')
    # $:以指定内容结尾
    c = re.compile(r'hello$')
    
    s = c.search('hakshehello')
    
    if s:
        print(s.group())
  • |的使用
    import re
    
    # |:或的意思,拥有最低的优先级
    # 若想指定优先级可以使用()
    c = re.compile(r'hell(o|w)orld')
    
    # s = c.search('helloorld')
    s = c.search('hellworld')
    
    if s:
        print(s.group())
  • 贪婪匹配
    • 贪婪:在满足条件的情况下,最大限定的匹配。正则的匹配默认是贪婪的。
    • 非贪婪:只要满足条件,能少匹配就少匹配。
    • 示例:
    import re
    
    # ?可以取消.+至少一次的贪婪
    # c = re.compile(r'a.+?b')
    # ?可以取消.*任意多次的贪婪
    c = re.compile(r'a.*?b')
    
    s = c.search('sahdjabbbbbasdja')
    
    if s:
        print(s.group())
  • 匹配模式
    import re
    
    # re.I:忽略大小写的匹配
    s = re.search(r'hello', 'Helloworld', re.I)
    
    if s:
        print(s.group())
    
    # re.M:多行匹配,默认是单行
    s = re.search(r'^hello', 'ashdjah\nhellosdajdksa', re.M)
    
    if s:
        print(s.group())
    
    string = '''<div>
    xxx
    </div>'''
    # re.S:单行处理,可以让.匹配包括\n的字符
    s = re.search(r'<div>.*?</div>', string, re.S)
    
    if s:
        print(s.group())
  • 分组匹配
    • 示例一:
    import re
    
    c = re.compile(r'(\d+)([a-z]+)(\d+)')
    
    s = c.search('adhaksj123dshfjsl456kdasdj')
    
    if s:
        # 完整的匹配结果
        print(s.group(), s.span())
        # 等价于上面的式子
        print(s.group(0), s.span(0))
        # 指定组号,获取对应组的匹配信息
        print(s.group(1), s.span(1))
        print(s.group(2), s.span(2))
        print(s.group(3), s.span(3))
        # 匹配的所有组信息
        print(s.groups())
    • 示例二:
    import re
    
    # 固定匹配
    # c = re.compile(r'<div><a>\w+</a></div>')
    
    # 无名分组:\1表示前面的第一组,即第一个()匹配的结果
    # c = re.compile(r'<([a-z]+)><([a-z]+)>\w+</\2></\1>')
    
    # 命名分组:
    c = re.compile(r'<(?P<goudan>[a-z]+)><(?P<dahua>[a-z]+)>\w+</(?P=dahua)></(?P=goudan)>')
    
    s = c.search('<div><a>千锋教育</a></div>')
    # s = c.search('<div><a>千锋教育</div></a>')
    
    if s:
        print(s.group())
        # 所有的匹配信息,适用于所有分组
        print(s.groups())
        # 所有的匹配信息,是一个字典,用于命名分组
        print(s.groupdict())

标签: python

发布评论 0条评论)

还木有评论哦,快来抢沙发吧~

复制成功
微信号: irenyuwang
关注微信公众号,站长免费提供流量增长方案。
我知道了