Regex 如何在python正则表达式中获取所有可能的子组?
我想在regex findall期间获得所有可能的子组: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]+
(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]之外的字母?