开发者社区> 问答> 正文

如何在python正则表达式中获取所有可能的子组?

我想在正则表达式findall期间获取所有可能的子组:(group(subgroup))+。当前,它仅返回最后的匹配项,例如:

>>> re.findall(r'SOME_STRING_(([A-D])[0-9]+)+_[A-Z]+', 'SOME_STRING_A2B2C3_OTK')
[('C3', 'C')]

现在,我必须分两个步骤进行操作:

>>> match = re.match(r'SOME_STRING_(([A-D][0-9]+)+)_[A-Z]+', 'SOME_STRING_A2B2C3_OTK')
>>> re.findall(r'([A-D])[0-9]+', match.group(1))
['A', 'B', 'C']

有什么方法可以让我一步得到相同的结果吗?

问题来源:stackoverflow

展开
收起
is大龙 2020-03-25 00:21:58 671 0
1 条回答
写回答
取消 提交回答
  • 由于`(([[AD])[0-9] +)+是重复捕获组,因此仅返回最后一个匹配结果也就不足为奇了。

    您可以使用PyPi regex库(可以通过在控制台/终端中键入pip install regex并按ENTER来安装),然后使用:

    import regex
    
    results = regex.finditer(r'SOME_STRING_(([A-D])[0-9]+)+_[A-Z]+', 'SOME_STRING_A2B2C3_OTK')
    print( [zip(x.captures(1),x.captures(2))  for x in results] )
    # => [[('A2', 'A'), ('B2', 'B'), ('C3', 'C')]]
    

    match.captures属性会跟踪所有捕获。

    如果只能使用re,则需要首先提取所有匹配项,然后对它们运行第二个正则表达式以提取所需的部分:

    import re
    tmp = re.findall(r'SOME_STRING_((?:[A-D][0-9]+)+)_[A-Z]+', 'SOME_STRING_A2B2C3_OTK')
    results = []
    for m in tmp:
        results.append(re.findall(r'(([A-D])[0-9]+)', m))
    print( results )
    # => [[('A2', 'A'), ('B2', 'B'), ('C3', 'C')]]
    

    参见Python演示

    回答来源:stackoverflow

    2020-03-25 00:22:07
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
From Python Scikit-Learn to Sc 立即下载
Data Pre-Processing in Python: 立即下载
双剑合璧-Python和大数据计算平台的结合 立即下载