繁体   English   中英

为什么要有re.match()?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM