Python re模块中的search()和match()函数有什么区别?

我读过Python 2文档(Python 3文档),但我似乎从来都不记得它。我得不停地查资料,重新学习。我希望有人能用例子清楚地回答这个问题,这样(也许)我就能记住它了。或者至少我可以有一个更好的地方带着我的问题回来,重新学习的时间也会更少。


当前回答

Re.search在整个字符串中搜索模式,而re.match不搜索模式;如果不匹配,则只能在字符串的开头匹配它。

其他回答

迅速的回答

re.search('test', ' test')      # returns a Truthy match object (because the search starts from any index) 

re.match('test', ' test')       # returns None (because the search start from 0 index)
re.match('test', 'test')        # returns a Truthy match object (match at 0 index)

Re.search在整个字符串中搜索模式,而re.match不搜索模式;如果不匹配,则只能在字符串的开头匹配它。

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

更严肃地说,就像John D. Cook所说的,re.match()“表现得好像每个模式都有^的前缀。”换句话说,re.match('pattern')等于re.search('^pattern')。所以它锚定了图案的左侧。但它也没有锚定模式的右侧:这仍然需要一个终止$。

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

更短:

搜索扫描整个字符串。 Match只扫描字符串的开头。

以下是前任说的:

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

匹配比搜索快得多,所以如果要处理数百万个样本,可以使用regex.match((.*?)word(.*?))而不是使用regex.search("word"),从而获得大量性能。

@ivan_bilan在上面接受的答案下的评论让我思考这样的黑客是否真的能加速任何东西,所以让我们来看看你能真正获得多少吨的性能。

我准备了以下测试套件:

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,…), 1000万字),这给了我以下的情节:

可以看到,搜索模式'python'比匹配模式'(.*?)python(.*?)'要快。

Python很聪明。不要试图变得更聪明。