如何提取正则表达式命名分组的名称与对应正则片段?
提取正则表达式命名分组对应的片段
给定正则表达式:
r"(?P<D>.8)(?P<foo>\d+)(?P<bar>[a-z]+)"
想要得到一个映射分组名称到对应正则片段的字典:
{'D': r'.8', 'foo': r'\d+', 'bar': r'[a-z]+'}
虽然Python的re模块里可以通过groupindex轻松获取分组名称,但并没有直接获取分组对应正则片段的内置方法,我们可以自己实现一个解析函数来解决这个问题。
解决方案
核心思路是用正则匹配命名分组的结构,提取分组名和对应的片段:
- 编写匹配命名分组的正则,捕获分组名和内部的正则片段
- 扫描目标正则字符串,整理成字典
代码示例:
import re def get_named_group_fragments(regex_str): # 匹配(?P<name>fragment)结构,假设分组内无嵌套括号 group_matcher = re.compile(r'\(\?P<(\w+)>([^()]+)\)') matched_groups = group_matcher.findall(regex_str) return {group_name: fragment for group_name, fragment in matched_groups} # 测试示例 target_regex = r"(?P<D>.8)(?P<foo>\d+)(?P<bar>[a-z]+)" group_dict = get_named_group_fragments(target_regex) print(group_dict) # 输出: {'D': '.8', 'foo': '\\d+', 'bar': '[a-z]+'}
注意事项
上述代码仅适用于无嵌套括号的命名分组。如果你的正则里存在嵌套括号(比如(?P<test>(a(b)c))),简单的正则匹配会失效,这种情况需要手动处理括号的嵌套计数,或者使用支持递归匹配的第三方库(如regex)来实现更精准的解析。
内容的提问来源于stack exchange,提问作者RobertHannah89
相关产品推荐
相关产品推荐

