zoukankan      html  css  js  c++  java
  • re模块

    此篇文章比较详细,写了些(?Pd+)等分组: https://www.cnblogs.com/zjltt/p/6955965.html https://www.cnblogs.com/shenjianping/p/11647473.html

    python-re模块 .,[],d,w,s,S,D,W的用法及重复匹配 https://docs.python.org/zh-cn/3/library/re.html
    re模块

    . 匹配除了
    之外的任意1个字符,若指定flag DOTALL,则匹配任意字符,包括换行
    [ ] 匹配[ ]中列举的字符
    d 匹配数字,即0-9
    D 匹配非数字,即不是数字
    s 匹配空白,即 空格,tab键
    S 匹配非空白
    w 匹配非特殊字符,即a-z、A-Z、0-9、_、汉字
    W 匹配特殊字符,即非字母、非数字、非汉字、非_
    
    re.match 从头开始匹配
    re.search 匹配包含
    re.findall 把所有匹配到的字符放到以列表中的元素返回
    re.split 以匹配到的字符当做列表分隔符
    re.sub 匹配字符并替换
    re.fullmatch 全部匹配
    
    Flags标志符
    re.I(re.IGNORECASE): 忽略大小写(括号内是完整写法,下同)
    M(MULTILINE): 多行模式,改变'^'和'$'的行为
    S(DOTALL): 改变'.'的行为,make the '.' special character match any character at all, including a newline; without this flag, '.' will match anything except a newline.
    X(re.VERBOSE) 可以给你的表达式写注释,使其更可读
    
    phones = re.findall(r'^a','abc
    aeee',flags=re.MULTILINE) # 输出 ['a', 'a']  
    phones1 = re.findall(r'^a','abc
    aeee',re.MULTILINE)  # 输出 ['a', 'a']  flags可以不写
    phones2 = re.findall(r'^a','abc
    aeee')  # 输出 ['a']
    
    
    In [11]: import re
    In [12]: re.findall(r'^a','abc
    aeee')    # 如果不指定re.MULTILINE就只能匹配一个
    Out[12]: ['a']
    In [13]: re.findall(r'^a','
    abc
    aeee')  # 如果不指定re.MULTILINE就只能匹配一个
    Out[13]: []
    In [20]: re.findall(r'^a','
    abc
    aeee',re.MULTILINE)
    Out[20]: ['a', 'a']
    
    # re.match从字符串的第一个字符开始匹配,匹配规则带不带^无所谓
    In [14]: re.match(r'^a','abc
    aeee')
    Out[14]: <_sre.SRE_Match object; span=(0, 1), match='a'>
    In [15]: re.match(r'^a','sadfdsafabc
    aeee')  # 返回None
    In [16]: re.match(r'a','sadfdsafabc
    aeee') # 返回None
    In [17]: re.search(r'a','sadfdsafdsaf')
    Out[17]: <_sre.SRE_Match object; span=(1, 2), match='a'>
    In [18]: re.search(r'^a','sadfdsafdsaf') # 返回None
    In [19]:
    
    
    
    phones = re.findall(r"1[358][0-9]{9}",data)  # 在一串文本中寻找手机号['13651054608', '13813234424',
    phones3 = re.match(r'^1[3|4|5|7|8][0-9]{9}$', '15823423525')  # 中间的|可以不用
    phones4 = re.match(r'^1[34578][0-9]{9}$', '15823423525')  # 匹配到返回<_sre.SRE_Match object; span=(0, 11), match='15823423525'>, 否则None
    phones5 = re.match(r'^1[34578][0-9]{9}$', '15823423525').group()  #慎用.group() 匹配到返回 15823423525 否则报错 AttributeError: 'NoneType' object has no attribute 'group'
    
    

    groups用法

    import re
    line = "Cats are smarter than dogs"
    matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)
    if matchObj:
        print ("matchObj.group()  : ", matchObj.group())
        print ("matchObj.group(0) : ", matchObj.group(0))
        print ("matchObj.group(1) : ", matchObj.group(1))
        print ("matchObj.group(2) : ", matchObj.group(2))
        # print ("matchObj.group(2) : ", matchObj.group(3))  #
    else:
        print("No match!!")
    

    将匹配的数字乘以 2

    import re
    
    def double(matched):
        value = int(matched.group('value'))
        return str(value * 2)
    s = 'A23G4HFD567'
    print(re.sub('(?P<value>d+)', double, s))
    
    # '^'    匹配字符开头,若指定flags MULTILINE 这种也可以匹配上(r'^:a','
    abc
    eee',flags=re.MULTILINE)
    # '$'   匹配字符结尾,若指定flags MULTILINE, re.search('foo.$','foo1
    foo2
    ',re.MULTILINE).group()
    # '*'    匹配*号前的字符0次或者多次,re.search('a','aaaaabac')   结果'aaaa'
    # '+'    匹配前一个字符1次或多次,   re.findall('ab+','ab+cd+add+bba')  结果['ab','abb']
    # '?'    匹配前一个字符0次或者I次,  re.search('b?','alex').group()  匹配b 0次
    # '{m}'  匹配前一个字符m次,re.search('b{3}','alexbbbs').group()  匹配到bbb
    # '{n,m}'  匹配前一个字符n到m次,  re.findall('ab{1,3}','abb abc abbcbbb')结果'abb','ab','abb'
    # '|'    匹配|左或|右的字符,re.search('abc|ABC','ABCabcCD').group()  结果'ABC
    # '(...)' 分组匹配, re.search("(abc){2}a(123|45)", "abcabca456c").group() 结果为'abcabca45'
    # 'A'    只从字符开头匹配,re.search("Aabc","alexabc") 是匹配不到的,相当于re.match('abc',"alexabc") 或^
    # ''    匹配字符结尾,同$
    #     'd'    匹配数字0-9
    #     'D'    匹配非数字
    #     'w'    匹配[A-Za-z0-9]
    #     'W'    匹配非[A-Za-z0-9]
    #     's'     匹配空白字符、	、
    、
     , re.search("s+","ab	c1
    3").group() 结果 '	'
    #     '(?P<name>...)' 分组匹配 re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{4})","371481199306143242").groupdict("city")
    #         结果{'province': '3714', 'city': '81', 'birthday': '1993'}
    In [21]: re.search('abc|ABC','ABCabcCD').group()
    Out[21]: 'ABC'
    
    In [22]: re.search('abc|ABC','ABCabcCD')
    Out[22]: <_sre.SRE_Match object; span=(0, 3), match='ABC'>
    
    In [23]: re.search('abc|ABC','abcABCabcCD')
    Out[23]: <_sre.SRE_Match object; span=(0, 3), match='abc'>
    
    In [24]: re.search('abc|ABC','abABCcABCabcCD')
    Out[24]: <_sre.SRE_Match object; span=(2, 5), match='ABC'>
    
    

    通配符

    一、常用正则表达式

    1、字符组

    2、字符

    元字符 匹配内容 元字符 匹配内容
    . 匹配除换行符以外的任意字符 () 匹配括号内的表达式,也表示一个组
    w 匹配字母或数字或下划线 W 匹配非字母或数字或下划线
    s 匹配任意的空白符 S 匹配非空白符
    d 匹配数字 D 匹配非数字
    匹配一个换行符 匹配一个制表符
     匹配一个单词的结尾 a b
    ^ 匹配字符串的开始 $ 匹配字符串的结尾
    [...] 匹配字符组中的字符 [^...] 匹配除了字符组中字符的所有字符

    2、量词

    量词 用法说明 量词 用法说明
    * 重复次数>=0 + 重复次数>=1
    ? 重复次数0或1 {n,m} 重复n到m次
    {n} 重复n次 {n,} 重复>=n次
    写入自己的博客中才能记得长久
  • 相关阅读:
    根据View找控制器
    ScrollView双击图片定点放大
    iOS消息推送原理和实现总结
    iOS完整学习路线图
    获取设备版本
    UIView与CALayer的区别,很详细
    iOS开发网络数据之AFNetworking使用
    (已实践)PLSQL本地还原Oracle数据库dmp文件
    所遇Oracle错误代码
    Dapper基本使用
  • 原文地址:https://www.cnblogs.com/heris/p/14076903.html
Copyright © 2011-2022 走看看