re.match 与 re.search 区别

0 投票
2 回答
3512 浏览
提问于 2025-04-17 12:29

如果我这样做

    import re
    m = re.compile("[0-9]{1,}Y")
    res = m.search("AUD3M25Y_EOD2")
    if res:
            return res.group(0)[:-1]

我会得到25作为结果

但是如果我这样做

    import re
    m = re.compile(".*([0-9]{1,})Y.*")
    res = m.match("AUD3M25Y_EOD2")
    if res:
            return res.groups(0)

我只会得到5。

为什么会有这样的差别呢?

这和“全局”选项有关吗?(有点像vi中的s///g)

2 个回答

1

请先阅读文档。正如你所期待的,它里面有答案。

re.search:

这个函数会在给定的字符串中查找符合正则表达式模式的位置,并返回一个匹配对象。如果字符串中没有任何位置符合这个模式,就返回None;需要注意的是,这和在字符串中找到一个长度为零的匹配是不同的。

re.match:

如果字符串开头的零个或多个字符符合正则表达式模式,就返回一个匹配对象。如果字符串不符合这个模式,就返回None;同样,这和找到一个长度为零的匹配是不同的。

注意:如果你想在字符串的任何位置找到匹配,请使用search()

另外,在同一页面上,还有关于 匹配与查找的内容:

Python 提供了两种基于正则表达式的基本操作:match 只检查字符串开头的匹配,而 search 会检查字符串中的任何位置是否有匹配(这也是 Perl 默认的行为)。

6

在你的匹配中,第一个 .* 是一种叫做 贪婪模式,它会尽可能多地匹配内容,包括数字。如果你让它变得不那么贪婪,它就能正常工作了:

 .*?([0-9]{1,})Y.*

(顺便说一下,我觉得这个贪婪的问题让 re.search 和 re.match 的比较不太公平)

撰写回答