之间有什么区别的 search()match() 职能 蟒蛇 re 模块?

我读的 文档 (目前的文件),但我似乎从来没有记住它。我一直有看起来,并重新学习。我希望有人会答案很清楚的例子,以便(也许)就会粘在我的头。或者至少我会有一个更好的地方带回来我的问题和它将采取更少的时间来重新学习。

有帮助吗?

解决方案

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

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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top