从regex文档中可以看出:
Pattern.match(...)
如果字符串开头有零个或多个字符,则匹配此正则表达式。
Pattern.fullmatch(...)
如果整个字符串与此正则表达式匹配
Pattern.search(...)
扫描字符串,查找此正则表达式生成匹配的第一个位置。
鉴于以上所述,为什么不能总是使用search来完成所有事情呢?例如:
re.search(r'...' # search
re.search(r'^...' or re.search(r'\A...' # match
re.search(r'^...$' or re.search(r'\A...\Z' # fullmatchmatch和fullmatch只是search方法的快捷方式(如果可以的话)吗?或者他们还有其他我忽略的用途?
发布于 2019-11-08 21:39:22
赞扬@Ruzihm的答复,因为我的部分答案来自于他的答案。
快速概述
对不同之处的简要叙述:
re.match锚定在start ^pattern
re.fullmatch锚定在模式^pattern$ 的开始和结束处。
re.search不是锚定的pattern
关于re.match和re.search的更深入的比较可以找到这里。
举几个例子:
aa # string
a|aa # regex
re.match: a
re.search: a
re.fullmatch: aaab # 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
\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.match和re.fullmatch分别不匹配线锚^和$,而是分别匹配字符串锚点\A和\Z。
发布于 2019-11-08 21:38:54
是的,它们可以被看作是re.search调用的快捷键,从\A开始,或者以\A开始,以\Z结束。
因为\A总是指定字符串的开头,所以即使在多行模式下,使用re.search和预挂\A似乎也等同于re.match。下面是一些例子:
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()与'^...$'匹配在每一行的开始和结尾。
https://stackoverflow.com/questions/58774029
复制相似问题