gpt4 book ai didi

python - 为什么有re.match()?

转载 作者:太空狗 更新时间:2023-10-30 00:10:36 24 4
gpt4 key购买 nike

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

虽然我很欣赏differences ,我真的无法找到关于 为什么 python 中的 re 模块同时提供 match()search( )。如果我在单行模式下添加 ^ 并在多行模式下添加 /A,我不能使用 search() 获得相同的行为吗?我错过了什么吗?

我试图通过查看 _sre.c 来理解实现代码,我知道搜索 (sre_search()) 实际上是在要搜索的字符串中移动指针,并在其上应用 sre_match(),直到找到匹配项。

所以我猜想使用 re.match() 可能比相应的正则表达式(使用 ^/A ) 使用 re.search()。是这个原因吗?

我还研究了 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.search 会继续测试字符串的每个位置,即使当 re.match 立即停止。

如果增加失败测试字符串的大小,您会发现 re.match 不会花费更多时间,但 re.search 取决于字符串大小.

关于python - 为什么有re.match()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29007197/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com