之间的区别是什么。搜索和重新。比赛?
解决方案
re.match
锚定在字符串的开头。这与换行符无关,因此与在模式中使用 ^
不同。
如果是零个或多个字符 字符串的开头匹配正则表达式模式,返回一个 相应的
MatchObject
实例。 如果字符串没有,则返回None
匹配模式;请注意这是 不同于零长度匹配。注意:如果要查找匹配项 在字符串中的任何位置,使用
search()
代替。
re.search
搜索整个字符串,如文档说明:
扫描字符串寻找a 正则表达式所在的位置 pattern产生匹配,并返回一个 相应的
MatchObject
实例。 如果没有位置,则返回None
字符串匹配模式;注意 这与找到一个不同 零长度匹配在某个点上 字符串。
因此,如果您需要在字符串的开头匹配,或者匹配整个字符串,请使用 match
。它更快。否则,请使用 search
。
该文档有一个 match <的特定部分/ code> vs.
也包含多行字符串: search
Python提供了两种不同的原语 基于常规的操作 表达式:
match
检查匹配 仅在字符串的开头, 而search
检查匹配 字符串中的任何地方(这是什么 默认情况下Perl会这样做。请注意,
match
可能与search
不同 即使使用正则表达式 以'^'
开头:'^'
仅匹配 在字符串的开头,或在MULTILINE
模式也立即生效 按照换行符。 &#8220;匹配
&#8221; 仅当模式时,操作才会成功 匹配字符串的开始 无论模式,还是在开始时 由可选的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
其他提示
search
&#8658;找到字符串中的任何位置并返回匹配对象。
match
&#8658;在字符串的开头找到一些东西并返回一个匹配对象。
re.search
搜索 es表示整个字符串,而 re.match
表示不搜索模式;如果没有,除了在字符串的开头匹配之外别无选择。
您可以参考以下示例来了解re.match和re.search
的工作原理a = "123abc"
t = re.match("[a-z]+",a)
t = re.search("[a-z]+",a)
re.match将不返回任何内容,但re.search将返回abc。
区别在于, re.match()
误导任何习惯于 Perl , grep 或 sed <的人/ em>正则表达式匹配,而 re.search()
则没有。: - )
更清醒地,正如约翰D.库克评论, re.match( )
“表现得好像每个模式都有^前置。”换句话说, re.match('pattern')
等于 re.search('^ pattern')
。所以它锚定了一个模式的左侧。但它也没有锚定模式的右侧:仍然需要终止 $
。
坦率地说,鉴于上述情况,我认为 re.match()
应该被弃用。我很想知道它应该保留的原因。
匹配比搜索快得多,所以你可以做regex.match((。*?)word(。*?))而不是做regex.search(&quot; word&quot;),如果你是的话,可以获得大量的性能使用数百万个样本。
来自@ivan_bilan的评论上面接受的答案让我想到如果这样的 hack 实际上是在加速任何事情,所以让我们找出你真正获得多少吨的表现。
我准备了以下测试套件:
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次测量(1M,2M,......,10M字),这给了我以下情节:
由此产生的线条令人惊讶地(实际上并不令人惊讶)直线。鉴于此特定模式组合, search
函数(略微)更快。这个测试的道德:避免过度优化你的代码。
re.match尝试匹配字符串开头的模式。 re.search尝试匹配整个字符串中的模式,直到找到匹配为止。
从短:
search
扫描槽整串。match
不才刚刚开始的串。
下面前说:
>>> a = "123abc"
>>> re.match("[a-z]+",a)
None
>>> re.search("[a-z]+",a)
abc