鱼C论坛

 找回密码
 立即注册
查看: 2152|回复: 2

[已解决]关于正则表达式中的命名组合(?P<name>...)的问题

[复制链接]
发表于 2020-7-26 17:24:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这是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'应该是一样的,为什么会出现匹配不上的情况呢?
求大神支招
最佳答案
2020-7-26 18:12:51
本帖最后由 sunrise085 于 2020-7-26 18:20 编辑

你这个肯定匹配不了啊,需要前后一致才能匹配,也就是后面用前面命名的组,那么内容也要一致,不仅仅是格式一致
你把s1改为"4 4"就可以了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-26 18:12:51 | 显示全部楼层    本楼为最佳答案   
本帖最后由 sunrise085 于 2020-7-26 18:20 编辑

你这个肯定匹配不了啊,需要前后一致才能匹配,也就是后面用前面命名的组,那么内容也要一致,不仅仅是格式一致
你把s1改为"4 4"就可以了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-26 18:26:11 | 显示全部楼层
sunrise085 发表于 2020-7-26 18:12
你这个肯定匹配不了啊,需要前后一致才能匹配,也就是后面用前面命名的组,那么内容也要一致,不仅仅是格式 ...

试了一下果然如此,非常感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-19 17:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表