首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >re.match、re.search、re.fullmatch的差异

re.match、re.search、re.fullmatch的差异
EN

Stack Overflow用户
提问于 2019-11-08 21:31:32
回答 2查看 13.8K关注 0票数 13

regex文档中可以看出:

Pattern.match(...)

如果字符串开头有零个或多个字符,则匹配此正则表达式。

Pattern.fullmatch(...)

如果整个字符串与此正则表达式匹配

Pattern.search(...)

扫描字符串,查找此正则表达式生成匹配的第一个位置。

鉴于以上所述,为什么不能总是使用search来完成所有事情呢?例如:

代码语言:javascript
复制
re.search(r'...'   # search
re.search(r'^...'  or re.search(r'\A...'   # match
re.search(r'^...$' or re.search(r'\A...\Z' # fullmatch

matchfullmatch只是search方法的快捷方式(如果可以的话)吗?或者他们还有其他我忽略的用途?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-08 21:39:22

赞扬@Ruzihm的答复,因为我的部分答案来自于他的答案。

快速概述

对不同之处的简要叙述:

  • re.match锚定在start ^pattern
    • 确保字符串以模式开头。

  • re.fullmatch锚定在模式^pattern$ 的开始和结束处。
    • 确保完整的字符串与模式相匹配(如所描述的这里所描述的替换可能特别有用)

  • re.search不是锚定的pattern
    • 确保字符串包含模式。

关于re.matchre.search的更深入的比较可以找到这里

举几个例子:

代码语言:javascript
复制
aa            # string
a|aa          # regex

re.match:     a
re.search:    a
re.fullmatch: aa
代码语言:javascript
复制
ab            # string
^a            # regex

re.match:     a
re.search:    a
re.fullmatch: # None (no match)

那么\A\Z锚呢?

文档声明如下:

Python基于正则表达式提供了两个不同的基本操作:re.match()只在字符串的开头检查匹配,而re.search()则检查字符串中任何位置的匹配(这是Perl默认的操作)。

Pattern.fullmatch一节中,它说:

如果整个字符串与此正则表达式匹配,则返回相应的match对象。

而且,正如鲁齐姆最初在其答复中所发现和引用的那样:

但是请注意,在多行模式下,match()只匹配在字符串的开头,而使用search()与以^开头的正则表达式匹配,则将匹配在每一行的开头。 re.match('X','A\nB\nX',re.MULTILINE) # No match >>> re.search('^X','A\nB\nX',re.MULTILINE) # Match

代码语言:javascript
复制
\A^A
B
X$\Z

# re.match('X', s)                  no match
# re.search('^X', s)                no match

# ------------------------------------------
# and the string above when re.MULTILINE is enabled effectively becomes

\A^A$
^B$
^C$\Z

# re.match('X', s, re.MULTILINE)    no match
# re.search('^X', s, re.MULTILINE)  match X

对于\A\Z,由于\A\Z实际上是整个字符串中唯一的^$,所以它们对re.MULTILINE的执行都不一样。

因此,将\A\Z与这三种方法中的任何一种一起使用都会产生相同的结果。

回答(行锚与字符串锚)

这告诉我,re.matchre.fullmatch分别不匹配线锚^$,而是分别匹配字符串锚点\A\Z

票数 19
EN

Stack Overflow用户

发布于 2019-11-08 21:38:54

是的,它们可以被看作是re.search调用的快捷键,从\A开始,或者以\A开始,以\Z结束。

因为\A总是指定字符串的开头,所以即使在多行模式下,使用re.search和预挂\A似乎也等同于re.match。下面是一些例子:

代码语言:javascript
复制
import re
haystack = "A\nB\nZ"

matchstring = 'A'
x=re.match(matchstring, haystack) # Match
y=re.search('\A' + matchstring, haystack) # Match

matchstring = 'A$\nB'
x=re.match(matchstring, haystack, re.MULTILINE) # Match
y=re.search('\A' + matchstring, haystack, re.MULTILINE) # Match

matchstring = 'A\n$B'
x=re.match(matchstring, haystack, re.MULTILINE) # No match
y=re.search('\A' + matchstring, haystack, re.MULTILINE) # No match

\A\Z之间放置搜索字符串以等同于fullmatch也是如此。

不包括\A / \Z

不,他们对多行有不同的看法。来自文献资料

但是请注意,在多行模式下,match()只在字符串的开头匹配,而使用带有以'^'开头的正则表达式的search()将在每一行的开头匹配。 .re.match('X','A\nB\nX',re.MULTILINE) # No match >>> re.search('^X','A\nB\nX',re.MULTILINE) # Match

同样,在多行模式下,fullmatch()在字符串的开始和结尾进行匹配,而search()'^...$'匹配在每一行的开始和结尾。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58774029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档