re.match vs re.search

时间:2012-02-07 05:19:22

标签: python regex python-2.6

如果我这样做

    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.

为什么会有差异?

是否与'global'选项有关? (很像s /// g in vi)

2 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:2)

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

re.search

  

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

re.match

  

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

     
    

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

  

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

  

Python提供了两种基于正则表达式的基本操作:匹配仅在字符串的开头检查匹配,而搜索检查匹配中的任何位置string(这是Perl默认执行的操作)。