获得比python中预期更多的匹配

时间:2014-11-19 05:50:19

标签: python regex

我试图在python中进行一些模式匹配。但是我无法理解为什么我只有一场比赛才能获得第二场比赛。

import re

def Main():
    m = "12312312ranger12312319"
    pattern = re.compile('(\d$)')
    r = pattern.search(m)
    if r:
        print "Matched " + r.group(0) +  " Second " + r.group(1)
    else:
        print "Not Matched"

if __name__ == '__main__':
    Main()

这给了我这样的输出

Matched 9 Second 9

我在想r.group(1)根本不应该存在。我错误地理解了吗?

3 个答案:

答案 0 :(得分:5)

group(0)将始终返回匹配的整个文本,无论它是否在组中捕获。见例:

import re

def Main():
    m = "12312312ranger12312319"
    pattern = re.compile('\d(\d$)')
    r = pattern.search(m)
    if r:
        print r.group(0) + ' ' + r.group(1)
    else:
        print "Not Matched"

if __name__ == '__main__':
    Main()

输出:

19 9

答案 1 :(得分:1)

因为您既匹配又捕获了一行末尾的最后一位数字。因此组(0)和组(1)指的是相同的。 (\d$)不仅可以捕获,还可以完成匹配工作。所以最后group(0)打印匹配的字符,group(1)打印捕获的组索引1中存在的所有字符。

答案 2 :(得分:0)

由于$符号,你匹配字符串的结尾!并且9是第一个和整个匹配模式group(0)(整个匹配)和group(1)(第一个带括号的子组)都返回9

Regular expression visualization

Debuggex Demo

现在,如果您不想要group(1),则需要从模式中删除分组并使用r'\d$',但请注意$与最后一个字符9匹配。

来自wiki的

  

group()返回匹配的一个或多个子组。如果只有一个参数,则结果为单个字符串;如果有多个参数,则结果是一个元组,每个参数有一个项目。如果没有参数,group1默认为零(返回整个匹配)。如果groupN参数为零,则相应的返回值是整个匹配的字符串;如果它在包含范围[1..99]中,则它是与相应的带括号的组匹配的字符串。如果组编号为负数或大于模式中定义的组数,则会引发IndexError异常。如果一个组包含在模式的一部分中,那么相应的结果为None。如果一个组包含在多次匹配的模式的一部分中,则返回最后一个匹配。

示例:

>>> m = re.match(r"(\w+) (\w+)", "Isaac Newton, physicist")
>>> m.group(0)       # The entire match
'Isaac Newton'
>>> m.group(1)       # The first parenthesized subgroup.
'Isaac'
>>> m.group(2)       # The second parenthesized subgroup.
'Newton'
>>> m.group(1, 2)    # Multiple arguments give us a tuple.
('Isaac', 'Newton')