python正则表达式函数match()和search()有哪些区别
python re 模块提供了许多有用的函数来使用正则表达式。其中两种常用的函数是 match() 和 search()。两个函数都是使用正则表达式来从文本中搜索匹配项,但是它们之间有一些重要的区别。
1. 匹配原则不同
match()函数会从字符串的起始位置开始匹配,一旦匹配不上就会返回None,如果匹配成功则会返回match对象。而search()函数在整个字符串中匹配,只要匹配成功,即使匹配位置不在字符串的起始位置,仍会返回match对象。
2. 适用场景不同
match()适用于从字符串的起始位置进行匹配,通常用于验证输入是否合法。比如,可以用match()函数来验证一个邮编是否满足格式要求,如下所示:
import re
regex = r'[1-9]\d{5}'
text = '邮编是100084'
match_obj = re.match(regex, text)
if match_obj:
print('匹配成功!')
else:
print('匹配失败!')
search()适用于从整个字符串中搜索匹配项,在文本中查找特定的字符串或模式。比如,可以用search()函数从一篇文章中查找所有出现过的 “Python” 关键词,如下所示:
import re
regex = r'Python'
text = 'Python是一种易学易用的编程语言,Python应用非常广泛。'
match_obj = re.search(regex, text)
if match_obj:
print('匹配成功!')
else:
print('匹配失败!')
3. 返回结果不同
match()函数只会匹配成功一次,如果需要匹配多个,需要使用循环,或使用findall()函数。而search()函数会匹配所有的符合条件的字符串。
import re
regex = r'hello'
text = 'hello world, hello python'
match_obj = re.match(regex, text)
if match_obj:
print('匹配的内容为:', match_obj.group())
else:
print('没有匹配到任何内容!')
运行结果
匹配的内容为: hello
import re
regex = r'hello'
text = 'hello world, hello python'
search_obj = re.search(regex, text)
if search_obj:
print('匹配的所有内容:', re.findall(regex, text))
else:
print('没有匹配到任何内容!')
运行结果
匹配的所有内容: ['hello', 'hello']
4. 正则表达式对象和匹配对象不同
match() 函数在匹配成功时返回的是一个 match 对象,不能用于查找所有的匹配结果。而 search() 函数返回的一个 sre_SRE_Match 对象,该对象包含了所有的匹配结果,可以通过 findall() 函数进行获取。
5. 性能差异
match() 函数可以消耗更少的计算时间,因为它只匹配字符串的开头,而 search() 函数在整个字符串中查找匹配。因此,在匹配字符串开头的情况下,match() 函数通常比 search() 函数更快。
6. 例外规则
如果在match()函数中使用了^符号来指定字符串起始位置,则与search()函数效果相同,只匹配字符串的起始部分。
如果正则表达式中包含了‘^’字符,该正则表达式就是针对每行文本的,而不仅仅是整个文件的,这时的search()函数和match()函数就不再等价。如果需要检查每行文本而非整个文本,请使用多行模式,例如将re.M标志传递作为search()或match()函数的参数。
综上所述,match()函数和search()函数都是使用正则表达式从文本中搜索匹配项的有用工具。但是,它们之间有许多重要的区别,需要根据使用场景选择适合的函数。在使用时需要注意正则表达式的语法,以便更好地实现所需的匹配规则。
