一.findall
在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。
1.
#!/usr/bin/python3
import re
if __name__ == '__main__':
line = "Cats are smarter than dogs Cats are smarter than do0gs Cats are smarter than dog Cats are smarter than dogs";
pattern = re.compile(r' (.*?) are (.*?) ')
searchObj = pattern.findall( line, re.M | re.I)
if searchObj:
print("searchObj.group() : ", searchObj)
else:
print("Nothing found!!")
结果:
searchObj.group() : [('than dogs Cats', 'smarter'), ('do0gs Cats', 'smarter'), ('dog Cats', 'smarter')]
2.
#!/usr/bin/python3
import re
if __name__ == '__main__':
line = "Cats are smarter than dogs Cats are smarter than do0gs Cats are smarter than dog Cats are smarter than dogs";
pattern = re.compile(r' (.*?) are (.*?) .*')
searchObj = pattern.findall( line, re.M | re.I)
if searchObj:
print("searchObj.group() : ", searchObj)
else:
print("Nothing found!!")
结果:
searchObj.group() : [('than dogs Cats', 'smarter')]
总结:r' (.*?) are (.*?) .*' 和r' (.*?) are (.*?) ' 在findall 查询结果不同,因为前一个匹配最后的.*默认到最后了
如果按如下:
#!/usr/bin/python3
import re
if __name__ == '__main__':
line = "Cats are smarter than dogs Cats are smarter than do0gs Cats are smarter than dog Cats are smarter than dogs";
pattern = re.compile(r' (.*?) are (.*?) .*?')
searchObj = pattern.findall( line, re.M | re.I)
if searchObj:
print("searchObj.group() : ", searchObj)
else:
print("Nothing found!!")
得到结果:
searchObj.group() : [('than dogs Cats', 'smarter'), ('do0gs Cats', 'smarter'), ('dog Cats', 'smarter')]
结果和2一样,这是非贪婪匹配起到了作用。