从文档中可以清楚地看出:
match()
- >在字符串的开头应用模式匹配search()
- >搜索字符串并返回第一个匹配项并search
有'^'
和没有re.M
标志会的工作一样match
.
那为什么python有match()
?这不是多余的吗?保持match()
python 是否有任何性能优势?
Eri*_*ric 11
该pos
论点在重要方面表现不同:
>>> s = "a ab abc abcd"
>>> re.compile('a').match(s, pos=2)
<_sre.SRE_Match object; span=(2, 3), match='a'>
>>> re.compile('^a').search(s, pos=2)
None
Run Code Online (Sandbox Code Playgroud)
match
可以编写一个tokenizer,并确保永远不会跳过字符.search
没有办法说"从最早的允许角色开始".
使用match来分解没有间隙的字符串的示例:
def tokenize(s, patt):
at = 0
while at < len(s):
m = patt.match(s, pos=at)
if not m:
raise ValueError("Did not expect character at location {}".format(at))
at = m.end()
yield m
Run Code Online (Sandbox Code Playgroud)
“为什么”的问题很难回答。事实上,您可以 re.match()
这样定义该函数:
def match(pattern, string, flags):\n return re.search(r"\\A(?:" + pattern + ")", string, flags)\n
Run Code Online (Sandbox Code Playgroud)\n\n(因为\\A
始终匹配字符串的开头,无论re.M
标志状态\xc2\xb4如何)。
这re.match
是一个有用的捷径,但并不是绝对必要的。Pattern.matches()
对于那些将搜索锚定到 字符串开头和结尾的Java 程序员来说,这尤其令人困惑(这可能是比仅仅锚定到开头更常见的用例)。
不过,正如 Eric 指出的那样,正则表达式对象match
的和方法是不同的。search