【问题标题】:re.match vs re.search重新匹配与重新搜索
【发布时间】:2012-02-28 14:12:19
【问题描述】:

如果我这样做

    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)

【问题讨论】:

    标签: python regex python-2.6


    【解决方案1】:

    在您的匹配中,第一个 .* 是 greedy,它尽可能匹配,包括数字。 如果你让它不那么贪婪,它会起作用:

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

    (PS 我认为这个贪婪的问题并不能使其成为 re.search 和 re.match 的公平比较)

    【讨论】:

    • 我个人还将{1,} 更改为+,因为+ 专门表示一个或多个。虽然我在这里,但[0-9] 会更好地显示为\d。可能只是我,但我发现 .*?(\d+)Y.*.*?([0-9]{1,})Y.* 更具可读性...
    【解决方案2】:

    请先阅读文档。如您所料,它有答案。

    re.search:

    扫描string,寻找正则表达式pattern产生匹配的位置,并返回对应的匹配对象。如果字符串中没有位置与模式匹配,则返回None;请注意,这与在字符串中的某个点找到零长度匹配不同。

    re.match:

    如果string开头的零个或多个字符匹配正则表达式pattern,则返回对应的匹配对象。如果字符串与模式不匹配,则返回None;请注意,这与零长度匹配不同。

    注意:如果您想在 string 中的任意位置找到匹配项,请改用 search()

    另外,在同一页面上,Matching vs. Searching

    Python 提供了两种基于正则表达式的不同原始操作:ma​​tch 仅在字符串的开头检查匹配,而 search 在字符串中的任何位置检查匹配。字符串(这是 Perl 默认所做的)。

    【讨论】:

    • 对此的反对意见似乎相当苛刻。他有两个不同的问题,真的,我回答了其中一个(而尼尔回答了另一个)。
    • 其实文档有点不清楚。当我第一次和第二次阅读它时,我仍然没有得到区别。声明如果在开头有匹配 match 将返回,这并不排除匹配找到不是从开头开始的东西的可能性。只有注释清楚地表明了这一点。更好的措辞包括“只有当匹配从字符串的开头开始时,才会由match 返回”。
    猜你喜欢
    • 1970-01-01
    • 2014-04-28
    • 2018-06-07
    • 1970-01-01
    • 1970-01-01
    • 2021-03-07
    • 1970-01-01
    • 2011-08-12
    • 1970-01-01
    相关资源
    最近更新 更多