day26 re正则表达式

 Python之路,Day14 = Python基础14

  1 compile()
  2 match()
  3 search()
  4 findall()
  5 
  6 m.group()  # 括号里面剋跟参数,表示打印里面(分组)的第几个元素(索引从1开始)   需要测试下
  7 
  8 
  9 a = re.compile(r'abc')     # 制作匹配规则
 10 a.search('abcdefghijk')    # a是一个对象
 11 
 12 match   # 从第一个开始匹配
 13 findall  # 找出所有符合规则的
 14 search  # 从前往后开始寻找
 15 
 16       元字符
 17 .       # 除换行符的任意字符
 18        # 转义字符
 19       # re 模块是 python 调用的一个 小型语言,如果 规则里面有 \ 的话,
 20       # python 解释器在读取的时候,就会先把它转成  去掉特殊意义,
 21       # 但是 re 里面还是需要转化  的特殊意义,所以,需要 \\ 来使用
 22       # 经过 python 的时候,变成了 \, 到 re 里面,就变成了 ;
 23 [...]   # 字符集合
 24     
 25 d      # 数字[0-9]
 26 D      # 非数字[^0-9]
 27 s      # 空白字符[<空格>	
f
]
 28 S      # 非空白字符[^s]
 29 w      # 单字字符[A-Za-z0-9]
 30 W      # 非单词字符[^w]
 31 
 32        数量词字符
 33 *       # 匹配前0个字符1次或者多次 
 34 +       # 匹配前一个字符1次或者多次 
 35 ?       # 匹配前一个字符0次或者1次
 36 {m}     # 匹配前一个字符m次
 37 {m,n}   # 匹配前一个字符m至n次
 38 数量词?# 变成非贪婪模式(默认为贪婪模式,尽可能的匹配多的次数)
 39 
 40 ^
 41 '^[abc]'        # 以a或b或c开头的
 42 '[^abc]'        # 非a、b、c
 43 
 44 
 45         边界字符
 46 ^       # 匹配字符串开头,多行匹配每一行开头
 47     '^[abc]'        # 以a或b或c开头的
 48     '[^abc]'        # 非a、b、c
 49 
 50 $       # 匹配字符串末尾,多行匹配每一行末尾
 51 A      # 仅匹配字符串开头,注意转义字符
 52       # 仅匹配字符串末尾,注意转义字符
 53       # 匹配w和W之间,注意转义字符
 54 
 55 
 56         逻辑、分组
 57 |       #
 58     ret = findall("www.(?:w+).(?:com|cn)")
 59             # findall  默认只显示 分组的信息(括号里面的), 加了 ?: 那么就取消优先级啊(打印所有)
 60             #  |  两个要用 括号 括起来
 61             
 62 (...)   # 匿名分组
 63         a = re.compile('(a)b(c)')
 64         a.match('abcdefg')
 65         a.groups()      # 分组匹配。会打印出一个元组,符合规则a的为第一个元素,符合规则c的为第二个元素,如果后面的规则也有括号的话,依次变为元素
 66         
 67         
 68 (?P<name>...)       # 除了分组外还替该组制定一个 name 的别名
 69         p = re.compile('(?P<name>a)b(c)')
 70         a = p.match('abcdef')
 71         a.group('name')   # 可以把这个对应的元素取出来
 72         a.groups()
 73         a.groupdict()
 74         
 75 
 76 <number>           # 引入编号为<number>的分组匹配到的字符串
 77         p = re.compile(r'(?<name>a)b(c)1')    # 注意 1 前面的  ,不加 r ,会被当成转义字符,可以写两个 
 78         # 1 像当与在这个位置引用了前面第一个的那个规则(分组里面的第一个),同样,不会被写入到分组中
 79         p.match('abcdef')
 80         a.groups()
 81         a.groupdict()
 82 
 83 
 84 (?P=name)           # 引用别名为<name>的分组匹配到的字符串
 85         p = re.compile('(?<name>a)b(c)(?P=name)')
 86         # (?P=name) 相当于在这个位置引用了前面那个 名字叫 name 的这个规则,虽然这里有括号,但是它只会匹配到,不会放入分组中
 87         p.match('abcdef')
 88         a.groups()
 89         a.groupdict()
 90 
 91 
 92 
 93         特殊构造
 94 (?:...)         # (...) 不分组版本,虽然在括号里面,但是不进行分组
 95 (?#...)         # #号后面的内容将作为注释
 96 (?=...)         # 后面的限定词满足 ... 条件
 97         re.compile(r'a(?=d)')        # 匹配前面是a,后面是数字的内容,得到的结果显示出a,不显示后面的数字
 98 (?!...)         # 后面的限定词不满足 ... 条件
 99 (?<=...)        # 前面的限定词满足 ... 条件
100 (?<!...)        # 前面的限定词不满足 ... 条件
101 (?(id/name) yes |no)        # 
102                 # re.compile(r'(d)?abc(?(1)d|abc)')    
103                     # 匹配规则为  (d)?abc ,有分组; 
104                     # (?(1)d|abc) 前面 分组里面位置为 1 的规则,可以是数字,也可以是 abcdef
105 
106 
107             正则表达式开关
108 忽略大小写:
109     可以写成:re.compile(r'(?i)abc')
110     开关模式:re.compile(r'abc', re.I)       # 推荐
111 
112     
113 sub
114     p = re.compile(r'(w) (w)')
115     s = 'hi you, good boy'
116     print(p.sub(r'2 1', s)
117     >>> you hi, boy good
原文地址:https://www.cnblogs.com/alwaysInMe/p/7082023.html