re.findall()的概念就是从字符串中匹配所有要查找的字符串出来,并输出为格式列表
re.match()则是查找字符串中起始位置是否为要查看的字符串,如果匹配成功则返回一个match object的对象,其中包含了匹配到的字符串的其实位置和字符串本身。如果在起始位置没有匹配到对应的字符串则返回None
re.search()则是查找整个字符串,并返回第一个匹配到的对象。它和re.match的区别在于即便匹配到的对象不在起始位置,也会返回。如果整个字符串都没有匹配到结果则返回None
如下代码:
给出了一个字符串,其中hello子串后面的标点有所区别,用于不同的匹配
import re
str = 'hello wolrd!hello, hello! everything'
match1 = re.findall('hello', str)
match2 = re.match('hello', str)
match3 = re.match('hello!,', str)
match4 = re.search('hello!', str)
print(match1)
print(match2)
print(match3)
print(match4)
下面是结果:
第一个findall()的结果可以看到,字符串中的所有“hello”都被找到了,并一起存在列表中
第二个match的结果可以看到在起始位置匹配到了“hello”子串,返回一个match的对象
第三个match的结果可以看到,在起始位置没有匹配到“hello!”子串,所以返回为None
第四个search的结果可以看到,match没有匹配到的结果,在search中匹配到了,即search不会限制匹配的子串一定要在起始位置出现
['hello', 'hello', 'hello']
.Match object; span=(0, 5), match='hello'>
None
.Match object; span=(22, 28), match='hello!'>
match()和search()都只会返回一个结果,比如一个字符串为"jingle bells, jingle bells, jingle all the way",可以看到"jingle"字符在其中出现了三次,但是使用search()函数匹配的时候也只会返回第一个"jingle"出现的位置信息组成的对象:
import re
str_jingle = 'jingle bells, jingle bells, jingle all the way'
match4 = re.search('jingle', str_jingle)
print(match4)
结果:
.Match object; span=(0, 6), match='jingle'>