使用组标签 ?P<> 将正则表达式转换为字典?

2 投票
1 回答
2109 浏览
提问于 2025-04-18 15:04

我在Python中使用regex模块,而不是默认的re模块。

我想做以下事情:

>>> regex.compile('(?P<heavy>heavily|heavy)').search("My laptop is heavy or heavily").groupdict()
{'heavy': 'heavy'}

我希望它返回:

{'heavy': ['heavy','heavily]}

regex.findall会匹配“heavy”和“heavily”,但是它在使用分组标签时却不奏效。

我必须用regex来解决这个问题,所以不能用逐个字符检查的方法。

1 个回答

2

你有没有看过关于正则表达式的Python文档?

相关内容:

当扫描目标字符串时,用'|'分隔的正则表达式会从左到右依次尝试。当某个模式完全匹配时,就会接受这个分支。这意味着一旦A匹配成功,B就不会再继续测试了,即使B能找到更长的匹配结果。

这就意味着你的正则表达式:

(?P<heavy>heavily|heavy)

会找到第一个匹配的字符串,也就是“heavy”,并把这个字符串保存下来。然后它会说:“恭喜,我完成了!”并结束扫描。

你需要一个能同时捕获两个字符串的正则表达式。它会把这个字符串heavy保存到一个组里(正如你的正则表达式所要求的),这个组也叫heavy。然后你的组字典命令会返回这个信息。所以你有一个名为heavy的组,里面有一个正则匹配结果,也是heavy,这就给你返回了

{"heavy": "heavy"}

要解决你的问题,有两种方法。

  1. 使用正则表达式的findall方法,它会返回一个列表,然后你可以把这个列表转成字典。这是更简单的方式。

  2. 设计一个能找到两个词并把它们放在同一个组里的正则表达式。虽然可以做到,但这会非常复杂。

如果你想搜索多个匹配,我强烈建议你使用findall方法。

撰写回答