为什么使用re.match(),当re.search()可以做同样的事情?

doc*_*n13 14 python regex

从文档中可以清楚地看出:

  • 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)


Tim*_*ker 4

“为什么”的问题很难回答。事实上,您可以 re.match()这样定义该函数:

\n\n
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如何)。

\n\n

re.match是一个有用的捷径,但并不是绝对必要的。Pattern.matches()对于那些将搜索锚定到 字符串开头和结尾的Java 程序员来说,这尤其令人困惑(这可能是比仅仅锚定到开头更常见的用例)。

\n\n

不过,正如 Eric 指出的那样,正则表达式对象match的和方法是不同的。search

\n