Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何在python正则表达式中获取所有可能的子组?_Regex_Python 3.x - Fatal编程技术网

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

Regex 如何在python正则表达式中获取所有可能的子组?,regex,python-3.x,Regex,Python 3.x,我想在regex 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]+

我想在regex 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']
是否有任何方法可以让我在一个步骤中获得相同的结果?

只要您的示例代码和示例数据都定义良好,就可以完成单个正则表达式(可能还有单次数据传递)解决方案。假设的前提是:

  • 某些字符串的长度是固定的。这是基于您给出的示例数据,其中
    SOME\u STRING\u
    读取的是文本字符串而不是正则表达式
  • 数据的“字母数字”部分不包含
    [E-Z]
    或其他异常。这是基于您正在工作的两行解决方案,该解决方案应该返回一个错误
    AttributeError:“NoneType”对象没有属性“group”
    ,如果存在
    SOME\u STRING\u A1B2Z3\u OTK
    之类的数据。但是,没有报告错误,因此我假设您没有此类数据
  • 如果满足上述条件,可以使用单个正则表达式
    r“[0-9]+”
    执行简单的字符串拆分。所有数字都被丢弃,因为。贪婪匹配理论上可以通过一次数据传递来完成,因此如果确实如此,效率应该是令人满意的。(不过,我没有检查实施细节。)

    解决方案

    import re    
    s = 'SOME_STRING_A10B20C30_OTK'  # len("SOME_STRING_") = 12 is fixed
                                     # may have multiple digits in between
    
    re.compile(r"[0-9]+").split(s[12:])[:-1]  # discard the last element
    # returns ['A', 'B', 'C']
    
    由于
    ([A-D])[0-9]+
    是A,因此只返回最后的匹配结果就不足为奇了

    您可以使用(您可以通过在控制台/终端中键入
    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')]]
    

    请参见

    AFAIK,您的两步示例是最好的方法。第一个示例仅返回C3的原因是
    findall
    返回所有不重叠的匹配项。
    ['A','B','C']
    是您想要的输出吗?如果您从说明规则(用文字)开始,读者会更容易阅读用于从字符串中提取感兴趣的信息。您可以使用。我认为
    (..)+
    语法与
    的关系不太好,但我找不到相关的参考。您是否有
    一些字符串\u A10E50\u OTK
    之类的数据,其中在“字母+数字”部分包含[a-D]之外的字母?