我试图在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)根本不应该存在。我错误地理解了吗?
答案 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
。
现在,如果您不想要group(1)
,则需要从模式中删除分组并使用r'\d$'
,但请注意$
与最后一个字符9
匹配。
:
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')