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_bilanmatch
在使用相同的正则表达式时看起来比search快一点,但根据性能测试,您的示例似乎是错误的:当使用以“^”开头的正则表达式且未指定MULTILINE
时,match
是否与search
相同(生成sam