为什么要有re.match()?

时间:2015-03-12 10:25:00

标签: python regex

我知道这个主题已在StackOverflow上讨论multiple times,但我正在寻找更好的答案。

虽然我很感谢differences,但我真的无法找到为什么 python中的re模块提供match()和{{}}的明确解释{1}}。 如果我在单行模式下添加search(),在多行模式下添加search(),我是否可以使用^获得相同的行为?我错过了什么吗?

我尝试了解查看_sre.c代码的实现,并且我理解搜索(/A)实际上已实现移动要搜索的字符串中的指针,并应用{{1在它上面,直到找到匹配。

所以我猜使用sre_search()可能会比使用sre_match()的相应正则表达式(使用re.match()^)略快一些。那是什么原因吗?

我还研究了python-dev ML档案,但无济于事。

/A

1 个答案:

答案 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取决于字符串大小。