Python 重新搜索和重新匹配之间有什么区别?

Python 重新搜索和重新匹配之间有什么区别?,python,regex,search,match,Python,Regex,Search,Match,中的search()和match()函数之间有什么区别 我读过这本书,但我似乎从来都不记得了。我不得不不断地查找并重新学习。我希望有人能用例子清楚地回答这个问题,这样(也许)它就会留在我的脑海里。或者至少我会有一个更好的地方来回答我的问题,重新学习它所需的时间会更少。re.match被锚定在字符串的开头。这与换行无关,因此它与在模式中使用^不同 正如政府所说: 如果在 字符串开头匹配正则表达式模式,返回 对应的MatchObject实例。 如果字符串不存在,则返回None 匹配模式;请注意,这是

中的
search()
match()
函数之间有什么区别


我读过这本书,但我似乎从来都不记得了。我不得不不断地查找并重新学习。我希望有人能用例子清楚地回答这个问题,这样(也许)它就会留在我的脑海里。或者至少我会有一个更好的地方来回答我的问题,重新学习它所需的时间会更少。

re.match
被锚定在字符串的开头。这与换行无关,因此它与在模式中使用
^
不同

正如政府所说:

如果在 字符串开头匹配正则表达式模式,返回 对应的
MatchObject
实例。 如果字符串不存在,则返回
None
匹配模式;请注意,这是 与零长度匹配不同

注意:如果要查找匹配项 在字符串中的任意位置,使用
search()
相反

re.search
搜索整个字符串,如下所示:

扫描字符串查找 正则表达式所在的位置 模式生成一个匹配项,并返回一个 对应的
MatchObject
实例。 如果列表中没有位置,则返回
None
字符串与模式匹配;注意 这不同于找到一个 中某个点的零长度匹配 绳子

因此,如果需要在字符串开头匹配,或者要匹配整个字符串,请使用
match
。它更快。否则,请使用
搜索

该文档还包含一个多行字符串:

Python提供了两种不同的原语 基于定期报告的业务 表达式:
match
检查是否匹配 仅在字符串的开头, 而
search
检查匹配项 字符串中的任何位置(这是 默认情况下,Perl不会这样做)

请注意,
match
可能不同于
search
即使在使用正则表达式时也是如此 以
'^'
开头:
'^'
仅匹配 在字符串的开头,或在
多行
模式 跟随一条新线。“
匹配
” 只有在模式正确时,操作才会成功 在字符串的开始处匹配 无论模式如何,或在开始时 由可选的
pos
无论 新行在前面

现在,说够了。是时候看一些示例代码了:

# example code:
string_with_newlines = """something
someotherthing"""

import re

print re.match('some', string_with_newlines) # matches
print re.match('someother', 
               string_with_newlines) # won't match
print re.match('^someother', string_with_newlines, 
               re.MULTILINE) # also won't match
print re.search('someother', 
                string_with_newlines) # finds something
print re.search('^someother', string_with_newlines, 
                re.MULTILINE) # also finds something

m = re.compile('thing$', re.MULTILINE)

print m.match(string_with_newlines) # no match
print m.match(string_with_newlines, pos=4) # matches
print m.search(string_with_newlines, 
               re.MULTILINE) # also matches

re.match尝试匹配字符串开头的模式。重新搜索尝试在整个字符串中匹配模式,直到找到匹配项。

重新搜索
在整个字符串中搜索模式,而
重新匹配
不搜索模式;如果不匹配,它就别无选择,只能在字符串开头匹配它。

搜索
⇒ 在字符串中的任意位置找到某个对象并返回匹配对象


匹配
⇒ 在字符串开头找到某个内容并返回匹配对象。

您可以参考下面的示例来了解
re.match
和re.search的工作原理

a = "123abc"
t = re.match("[a-z]+",a)
t = re.search("[a-z]+",a)

re.match
将返回
none
,但
re.search
将返回
abc

区别在于,
re.match()
误导任何习惯于Perl、grep或sed正则表达式匹配的人,而
re.search()
则不会。
:-)


更清醒地说,
re.match()
“表现得好像每个模式都有^prepend。”换句话说,
re.match('pattern')
等于
re.search('^pattern')
。所以它锚定了图案的左侧。但它也不能锚定模式的右侧:这仍然需要终止
$

坦率地说,鉴于上述情况,我认为
re.match()
应该被弃用。我想知道它应该保留的原因

match比search快得多,因此,如果使用数百万个示例,您可以使用regex.match(.*)word(.*)来代替regex.search(“word”),并获得大量性能

让我想到,如果这样的黑客真的在加速什么,那么让我们看看你将真正获得多少吨的性能

我准备了以下测试套件:

import random
import re
import string
import time

LENGTH = 10
LIST_SIZE = 1000000

def generate_word():
    word = [random.choice(string.ascii_lowercase) for _ in range(LENGTH)]
    word = ''.join(word)
    return word

wordlist = [generate_word() for _ in range(LIST_SIZE)]

start = time.time()
[re.search('python', word) for word in wordlist]
print('search:', time.time() - start)

start = time.time()
[re.match('(.*?)python(.*?)', word) for word in wordlist]
print('match:', time.time() - start)
我做了10次测量(1米,2米,…,10米单词),得到了以下曲线图:

结果得到的直线令人惊讶(实际上并不那么令人惊讶)笔直。在这种特定的模式组合下,
搜索
功能(稍微)更快。此测试的寓意是:避免过度优化代码。

要短得多:

  • search
    扫描整个字符串

  • match
    只扫描字符串的开头

下面的例子说:

>>> a = "123abc"
>>> re.match("[a-z]+",a)
None
>>> re.search("[a-z]+",a)
abc

为什么有人会使用有限的
匹配
而不是更一般的
搜索
?是为了速度吗?@Alby-match比搜索快得多,因此,如果使用数百万个样本,您可以使用regex.match(.*word)(.*word),而不是使用regex.search(“word”),并获得大量性能。这太愚蠢了。为什么称之为“匹配”
?用不直观的名称来填充API以迫使我阅读文档,这是一种聪明的策略吗?我还是不做!反抗@ivan_bilan
match
在使用相同的正则表达式时看起来比search快一点,但根据性能测试,您的示例似乎是错误的:当使用以“^”开头的正则表达式且未指定
MULTILINE
时,
match
是否与
search
相同(生成sam