如何使用python 3正则表达式捕获重复出现的事件

时间:2019-03-31 03:52:34

标签: regex python-3.x

考虑句子:W U T样本A B C D

我正在尝试在re.groups之后使用re.search来获取A,B,C,D(“ Sample”之后的大写字母)。字母数可能会变化

很少失败的尝试:

A = re.search('Sample\s([A-Z])\s*([A-Z])*', 'W U T Sample A B C D')
A.groups()
('A', 'B')

A = re.search('Sample\s([A-Z])(\s*([A-Z]))*', 'W U T Sample A B C D')
A.groups()
('A', ' D', 'D')

A = re.search('Sample\s([A-Z])(?:\s*([A-Z]))*', 'W U T Sample A B C D')
A.groups()
('A', 'D')

我希望A.groups()会给('A', 'B', 'C', 'D')

再举一个例子,“ XSS 55 D W Sample R G Y BH”应给出输出('R', 'G', 'Y', 'B', 'H')

1 个答案:

答案 0 :(得分:1)

大多数正则表达式引擎(包括Python的引擎)将覆盖重复的捕获组。因此,您看到的重复捕获组将只是最后一个,而您当前的方法将行不通。解决方法是,我们可以先尝试隔离所需的子字符串,然后再应用re.findall

input = "W U T Sample A B C D"
text = re.search(r'Sample\s([A-Z](?:\s*[A-Z])*)', input).group(1)  # A B C D
result = re.findall(r'[A-Z]', text)
print(result)

['A', 'B', 'C', 'D']