#重复匹配:. [] ? * + {}
?:左边那个字符出现0次或1次
print(re.findall('ab?','a ab abb abbb abbbbbb'))
print(re.findall('ab{0,1}','a ab abb abbb abbbbbb'))
*:左边那个字符出现0次或无穷次
print(re.findall('ab*','a ab abb abbb abbbbbb abbc123bbbb'))
print(re.findall('ab{0,}','a ab abb abbb abbbbbb abbc123bbbb'))
+:左边那个字符出现1次或无穷次
re.findall('ab+','a ab abb abbb abbbbbb abbc123bbbb')
re.findall('ab{1,}','a ab abb abbb abbbbbb abbc123bbbb')
贪婪匹配:.*
print(re.findall('a.*b','a123b456b'))
非贪婪匹配:.*?
print(re.findall('a.*?b','a123b456b'))
分组:()
print(re.findall('<imag href="(.*)" />',
'<h1>hello</h1><a href="http://www.baidu.com"></a><imag href="http://www.baidu.com/a.jpg" />'))
只留下组内的内容
print(re.findall('<imag href="(?:.*)" />',
'<h1>hello</h1><a href="http://www.baidu.com"></a><imag href="http://www.baidu.com/a.jpg" />'))
| 管道符
print(re.findall('compan(?:ies|y)','Too many companies have gone bankrupt, and the next one is my company'))
注意:
在python中使用正则表达式,会先被python式识别一次。(也就是会先消耗一次)
print(re.findall('a\\c','ac a12 a2c')) #'a\c' 所以要想多写两个
print(re.findall(r'a\c','ac a12 a2c')) #'a\c'
1 #为何同样的表达式search与findall却有不同结果: 2 print(re.search('(([+-*/]*d+.?d*)+)',"1-12*(60+(-40.35/5)-(-4*3))").group()) #(-40.35/5) 3 print(re.findall('(([+-*/]*d+.?d*)+)',"1-12*(60+(-40.35/5)-(-4*3))")) #['/5', '*3'] 4 5 #看这个例子:(d)+相当于(d)(d)(d)(d)...,是一系列分组 6 print(re.search('(d)+','123').group()) #group的作用是将所有组拼接到一起显示出来 7 print(re.findall('(d)+','123')) #findall结果是组内的结果,且是最后一个组的结果 8 对于这种情况 取了3次值 9 分别是 ‘1’ ‘ 2’ ‘3’ 10 最后就显示了 3 这个数字