考虑以下字符串:
s="""A25-54 plus affinities targeting,Demo (AA F21-54),
A25-49 Artist Affinity Targeting,M21-49 plus,plus plus A 21+ targeting"""
我正在寻找一种模式,该模式当前无法提取字符串中的所有年龄段(当前输出中缺少A 21+
)。
当前尝试:
import re
re.findall(r'(?:A|A |AA F|M)(\d+-\d+)',s)
输出:
['25-54', '21-54', '25-49', '21-49'] #doesnot capture the last group A 21+
预期输出:
['A25-54','AA F21-54','A25-49','M21-49','A 21+']
如您所见,我也希望有最后一个组A 21+
,目前我的输出中缺少该组。
也可以获取与捕获组关联的字符串。目前,除了不捕获所有组外,我的输出还没有年龄组之前的字符串。例如:我想是因为'A25-54
,所以我想用'25-54'
而不是?:
。
感谢我可以获得的任何帮助。
答案 0 :(得分:2)
匹配项的缺失部分是由于您的模式包含一个捕获组,并且一旦正则表达式中存在一个捕获组,re.findall
仅返回该部分。第二个问题是,您应该匹配-
后跟1个或多个数字 或匹配第一个或多个数字后的文字+
。
您可以使用
(?:A|A |AA F|M)\d+(?:-\d+|\+)
注意:您可能想在开头添加一个单词边界,以仅将A
,AA F
等匹配为整个单词:r'\b(?:A|A |AA F|M)\d+(?:-\d+|\+)'
详细信息
(?:A|A |AA F|M)
-匹配A
,A
,AA
,AA F
或M
的非捕获组\d+
-1个以上数字(?:-\d+|\+)
-一个非捕获组,匹配-
及其后的1+数字或单个+
符号。import re
s="""A25-54 plus affinities targeting,Demo (AA F21-54),
A25-49 Artist Affinity Targeting,M21-49 plus,plus plus A 21+ targeting"""
print(re.findall(r'(?:A|A |AA F|M)\d+(?:-\d+|\+)',s))
# => ['A25-54', 'AA F21-54', 'A25-49', 'M21-49', 'A 21+']