从字符串中提取年龄 - Python

4

请考虑以下字符串:

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个回答

4
您所匹配不到的部分是因为您的模式中包含一个捕获组,一旦正则表达式中有一个捕获组,re.findall 只会返回该部分。第二个问题是,您需要匹配一个 - 后面跟着1个或多个数字 或者 在匹配了一个或多个数字后匹配一个文字 + 符号。
您可以使用:
(?:A|A |AA F|M)\d+(?:-\d+|\+)

注意: 您可能希望在开头添加一个单词边界,只匹配整个单词的A, AA F等: r'\b(?:A|A |AA F|M)\d+(?:-\d+|\+)'.

请参见正则表达式演示正则表达式图形:

enter image description here

细节

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

Python演示:

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

1
FYI:你可以将第一组进一步简化为 (?:A(?: |A F)?|M)\d+(?:-\d+|\+)。虽然不太易读,但它遵循最佳实践:组内的每个替代项都不应与其他组在同一位置匹配。 - Wiktor Stribiżew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接