从字符串python中提取年龄

时间:2019-06-12 10:09:45

标签: python regex

考虑以下字符串:

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'而不是?:

感谢我可以获得的任何帮助。

1 个答案:

答案 0 :(得分:2)

匹配项的缺失部分是由于您的模式包含一个捕获组,并且一旦正则表达式中存在一个捕获组,re.findall仅返回该部分。第二个问题是,您应该匹配-后跟1个或多个数字 或匹配第一个或多个数字后的文字+

您可以使用

(?:A|A |AA F|M)\d+(?:-\d+|\+)

注意:您可能想在开头添加一个单词边界,以仅将AAA F等匹配为整个单词:r'\b(?:A|A |AA F|M)\d+(?:-\d+|\+)'

请参见regex demoregex graph

enter image description here

详细信息

  • (?:A|A |AA F|M)-匹配AA AA AA FM的非捕获组
  • \d+-1个以上数字
  • (?:-\d+|\+)-一个非捕获组,匹配-及其后的1+数字或单个+符号。

Python demo

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+']