正则表达式其他都还好理解,就“|”、“?”使用过程中掉过坑里,特此几个列子记录下,仍然用ipython来测试,以备查阅。
先说明下:
正则表达式 “|” # 匹配|之前的正则或之后的正则
多个字符匹配 “?” # 匹配?之前的正则要么没有要么有且只有1个
一、"|" 或
In [261]: re.match("[a-z]?\d$|300", "0").group()
Out[261]: '0'
In [262]: re.match("[a-z]?\d$|300", "300").group()
Out[262]: '300'
re.match("[a-z]?\d$|300", "a300").group() # 匹配失败,既不符合|之前的正则“[a-z]?\d$"($表示正则要匹配到给出字符串的末尾),也不符合|之后的正则"300",所以匹配失败
AttributeError: 'NoneType' object has no attribute 'group'
In [265]: re.match("[a-z]?\d|300", "a300").group() # 去掉正则中的$则有匹配输出
Out[265]: 'a3'
In [287]: re.match("[a-z]\d{1,9}(a|b)|300","a300b300").group()
Out[287]: 'a300b'
通过括号()来作为表达式改变或“|”正则运算的条件
In [288]: re.match("[a-z]\d{1,9}(a|b)|300","300").group()
Out[288]: '300'
In [293]: re.match("[a-z]\d{1,9}(a|b)|300","a300").group() #匹配失败
AttributeError: 'NoneType' object has no attribute 'group'
In [294]: re.match("[a-z]\d{1,9}(a|b)|300","a300b").group()
Out[294]: 'a300b'
In [289]: re.match("[a-z]\d{1,9}a|b|300","300").group()
Out[289]: '300'
In [290]: re.match("[a-z]\d{1,9}a|b|300","a300a").group()
Out[290]: 'a300a'
In [291]: re.match("[a-z]\d{1,9}a|b|300","a300").group() #匹配失败
AttributeError: 'NoneType' object has no attribute 'group'
In [292]: re.match("[a-z]\d{1,9}a|b|300","b").group()
Out[292]: 'b'
()作为分组
In [302]: re.match("[a-z]\d{1,9}(a)|(b)|300","b").group()
Out[302]: 'b'
In [303]: re.match("[a-z]\d{1,9}(a)|(b)|300","b").group(1) # group(1)没有匹配到数据因此为空
In [304]: re.match("[a-z]\d{1,9}(a)|(b)|300","b").group(2)
Out[304]: 'b'
二、通过?实现非贪婪,可以在+,*,?,{n,m},四个匹配多个字符的正则后面加上?实现非贪婪
+
In [270]: re.match("[a-z]\d+|300", "a400").group() # 贪婪
Out[270]: 'a400'
In [269]: re.match("[a-z]\d+?|300", "a400").group() # 非贪婪
Out[269]: 'a4'
*
In [273]: re.match("[a-z]\d*|300", "a400").group() # 贪婪
Out[273]: 'a400'
In [274]: re.match("[a-z]\d*?|300", "a400").group() # 非贪婪
Out[274]: 'a'
?
In [276]: re.match("[a-z]\d?|300", "a400").group() # 贪婪
Out[276]: 'a4'
In [275]: re.match("[a-z]\d??|300", "a400").group() # 非贪婪
Out[275]: 'a'
{n,m}
In [281]: re.match("[a-z]\d{1,3}|300", "a400").group() # 贪婪
Out[281]: 'a400'
In [280]: re.match("[a-z]\d{1,3}?|300", "a400").group() # 非贪婪
Out[280]: 'a4'