关于正则表达式中的命名组合(?P<name>...)的问题
这是python的官方文档对命名组合的描述:(?P<name>…)
(命名组合)类似正则组合,但是匹配到的子串组在外部是通过定义的 name 来获取的。组合名必须是有效的Python标识符,并且每个组合名只能用一个正则表达式定义,只能定义一次。一个符号组合同样是一个数字组合,就像这个组合没有被命名一样。
命名组合可以在三种上下文中引用。如果样式是 (?P<quote>['"]).*?(?P=quote) (也就是说,匹配单引号或者双引号括起来的字符串):
引用组合 "quote" 的上下文
引用方法:
在正则式自身内:
(?P=quote) (如示)
\1
处理匹配对象 m:
m.group('quote')
m.end('quote') (等)
传递到 re.sub() 里的 repl 参数中:
\g<quote>
\g<1>
\1
我的理解是,命名组合可以让我命名一个捕获组,同时定义后可以在别处引用,于是我写了如下代码:
import re
#匹配两个中间由空格分开的数字
foo = re.compile(r'(?P<NUM>\d) (?P=NUM)')
#"(?P=NUM)"引用了前面命名过的捕获组
s1 = "3 4"
print(foo.findall(s1))
奇怪的是,这段代码的输出是一个空列表"[]",而非我预想的输出["3 4"]
如果我把匹配规则改成:
foo = re.compile(r'\d \d')
则又可以正常匹配了
在我的理解里,规则'(?P<NUM>\d) (?P=NUM)'和'\d \d'应该是一样的,为什么会出现匹配不上的情况呢?
求大神支招 本帖最后由 sunrise085 于 2020-7-26 18:20 编辑
你这个肯定匹配不了啊,需要前后一致才能匹配,也就是后面用前面命名的组,那么内容也要一致,不仅仅是格式一致
你把s1改为"4 4"就可以了。 sunrise085 发表于 2020-7-26 18:12
你这个肯定匹配不了啊,需要前后一致才能匹配,也就是后面用前面命名的组,那么内容也要一致,不仅仅是格式 ...
试了一下果然如此,非常感谢!
页:
[1]