当前位置:  开发笔记 > 编程语言 > 正文

re.search和re.match有什么区别?

如何解决《re.search和re.match有什么区别?》经验,为你挑选了7个好方法。

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

我已经阅读了文档(当前文档),但我似乎永远不会记住它.我不得不查阅并重新学习它.我希望有人会用例子清楚地回答它,以便(也许)它会坚持到底.或者至少我会有一个更好的地方回答我的问题,重新学习它将花费更少的时间.



1> nosklo..:

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

正如re.match文档所说:

如果字符串开头的零个或多个字符 与正则表达式模式匹配,则返回相应的MatchObject实例.None如果字符串与模式不匹配则返回; 请注意,这与零长度匹配不同.

注意:如果要在字符串中的任何位置找到匹配项,请search() 改用.

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

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

所以如果你需要在字符串的开头匹配,或者匹配整个字符串使用match.它更快.否则使用search.

该文档有一个针对matchvs.search的特定部分,其中还包含多行字符串:

:python提供基于正则表达式两种不同的基本操作match进行匹配检查, 才刚刚开始的字符串,而search用于匹配检查 任何地方的字符串(这是Perl并默认情况下).

请注意, 即使使用以下列开头的正则表达式,match也可能有所不同:仅在字符串的search开头匹配,或者在 紧跟在换行符后的模式中.只有当模式在字符串开头匹配时, 无论模式如何,或者在可选 参数给出的起始位置,无论新行是否在它之前," "操作都会成功.'^''^'MULTILINEmatchpos

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

# 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


为什么有人会使用有限的"匹配"而不是更普遍的"搜索"呢?这是速度吗?
嗯,这太傻了.为什么称它为"匹配"?使用不直观的名称来强制我阅读文档是一种聪明的策略吗?我仍然不会这样做!反叛!
@Alby匹配比搜索快得多,所以你可以使用regex.match((.*?)word(.*?))代替regex.search("word"),并且如果你正在使用的话,可以获得大量的性能数百万个样本.

2> Dhanasekaran..:

search ⇒在字符串中的任何位置查找并返回匹配对象.

match⇒ 在字符串的开头找到一些东西并返回一个匹配对象.



3> 小智..:

re.search 搜索的模式ES 整个字符串,而re.match没有搜索不到的格局; 如果没有,除了在字符串的开头匹配它,别无选择.


为什么在开始时匹配,但直到字符串结尾(phyton 3.4中的`fullmatch`)?

4> Jeyekomon..:

匹配比搜索快得多,所以你可以做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,......,10M字)给了我以下图:

匹配与搜索正则表达式speedtest线图

由此产生的线条令人惊讶地(实际上并不令人惊讶地)直线.并且考虑到这种特定的模式组合,该search功能(稍微)更快.这个测试的道德:避免过度优化你的代码.


+1用于实际调查声明背后的假设,这些假设旨在让您从表面上看得出来-谢谢。

5> 小智..:

您可以参考以下示例来了解re.match和re.search的工作情况

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

re.match将不返回任何内容,但re.search将返回abc.


只想添加搜索将返回_sre.SRE_Match对象(如果未找到则返回None).要获得'abc',你需要调用t.group()

6> CODE-REaD..:

不同的是,re.match()误导任何习惯于Perl,grepsed正则表达式匹配的人,而re.search()不是.:-)

更为清醒的是,正如约翰·D·库克所言,re.match()"表现得好像每个模式都在前面." 换句话说,re.match('pattern')等于re.search('^pattern').所以它锚定了一个模式的左侧.但它也没有锚定模式的右侧:仍然需要终止$.

坦率地说,我认为re.match()应该弃用.我很想知道它应该保留的原因.


"表现得好像每个模式都有^前置." 仅当您不使用多行选项时才是真的.正确的陈述是"......有\前置"

7> cschol..:

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

推荐阅读
勤奋的瞌睡猪_715
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有