[英]Why have re.match()?
我知道这个话题已经讨论过多次 次在这里StackOverflow上,但我在寻找一个更好的答案。
虽然我很欣赏这些差异 ,但我真的无法找到为什么 python中的re
模块同时提供match()
和search()
的明确解释。 如果我在单行模式下添加^
,在多行模式下添加/A
,我是否可以使用search()
获得相同的行为? 我错过了什么吗?
我试着理解查看_sre.c代码的实现,我理解搜索( sre_search()
)实际上是实现了在要搜索的字符串中移动指针,并在其上应用sre_match()
,直到匹配为止找到。
所以我猜使用re.match()
可能比使用re.search()
的相应正则表达式(使用^
或/A
)稍快一些。 这是什么原因?
我也研究了python-dev ML档案,但无济于事。
>>> string="""first line
... second line"""
>>> print re.match('first', string, re.MULTILINE)
<_sre.SRE_Match object at 0x1072ae7e8>
>>> print re.match('second', string, re.MULTILINE)
None
>>> print re.search('\Afirst', string, re.MULTILINE)
<_sre.SRE_Match object at 0x1072ae7e8>
>>> print re.search('\Asecond', string, re.MULTILINE)
None
如您所知, re.match
将仅在字符串的开头测试模式, re.search
将测试所有字符串,直到找到匹配项。
那么, re.match('toto', s)
和re.search('^toto', s)
和它是什么有区别?
让我们做一点测试:
#!/usr/bin/python
import time
import re
p1 = re.compile(r'toto')
p2 = re.compile(r'^toto')
ssize = 1000
s1 = 'toto abcdefghijklmnopqrstuvwxyz012356789'*ssize
s2 = 'titi abcdefghijklmnopqrstuvwxyz012356789'*ssize
nb = 1000
i = 0
t0 = time.time()
while i < nb:
p1.match(s1)
i += 1
t1 = time.time()
i = 0
t2 = time.time()
while i < nb:
p2.search(s1)
i += 1
t3 = time.time()
print "\nsucceed\nmatch:"
print (t1-t0)
print "search:"
print (t3-t2)
i = 0
t0 = time.time()
while i < nb:
p1.match(s2)
i += 1
t1 = time.time()
i = 0
t2 = time.time()
while i < nb:
p2.search(s2)
i += 1
t3 = time.time()
print "\nfail\nmatch:"
print (t1-t0)
print "search:"
print (t3-t2)
这两种方法使用不匹配的字符串和匹配的字符串进行测试。
结果:
succeed
match:
0.000469207763672
search:
0.000494003295898
fail
match:
0.000430107116699
search:
0.46605682373
我们可以用这些结果得出什么结论:
1)当模式成功时,性能相似
2)当模式失败时,性能完全不同。 这是最重要的一点,因为这意味着即使在re.match
立即停止时锚定模式 , re.search
也会继续测试字符串的每个位置 。
如果增加失败的测试字符串的大小,您将看到re.match
不会花费更多时间,但re.search
取决于字符串大小。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.