我知道这个主题已在StackOverflow上讨论multiple times,但我正在寻找更好的答案。
虽然我很感谢differences,但我真的无法找到为什么 python中的re
模块提供match()
和{{}}的明确解释{1}}。
如果我在单行模式下添加search()
,在多行模式下添加search()
,我是否可以使用^
获得相同的行为?我错过了什么吗?
我尝试了解查看_sre.c代码的实现,并且我理解搜索(/A
)实际上已实现移动要搜索的字符串中的指针,并应用{{1在它上面,直到找到匹配。
所以我猜使用sre_search()
可能会比使用sre_match()
的相应正则表达式(使用re.match()
或^
)略快一些。那是什么原因吗?
我还研究了python-dev ML档案,但无济于事。
/A
答案 0 :(得分:3)
如您所知,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.search
会继续测试字符串的每个位置,即使模式已锚定,re.match
立即停止。
如果增加失败测试字符串的大小,您会发现re.match
不会花费更多时间,re.search
取决于字符串大小。