在Python中使用findall和括号

在Python中使用findall和括号,python,regex,Python,Regex,我需要提取+符号后或字符串开头的所有字母,如下所示: formula = "X+BC+DAF" 我试过了,但我不想在结果中看到+符号。我只希望看到['X','B','D'] >>> re.findall("^[A-Z]|[+][A-Z]", formula) ['X', '+B', '+D'] 当我用括号分组时,得到了一个奇怪的结果: re.findall("^([A-Z])|[+]([A-Z])", formula) [('X', ''), ('', 'B'), ('',

我需要提取
+
符号后或字符串开头的所有字母,如下所示:

formula = "X+BC+DAF"
我试过了,但我不想在结果中看到
+
符号。我只希望看到
['X','B','D']

>>> re.findall("^[A-Z]|[+][A-Z]", formula)
['X', '+B', '+D']
当我用括号分组时,得到了一个奇怪的结果:

re.findall("^([A-Z])|[+]([A-Z])", formula)
[('X', ''), ('', 'B'), ('', 'D')]

为什么在我尝试分组时它会创建元组?如何直接写入regexp,使其返回
['X','B','D']

如果正则表达式中有任何捕获组,则只返回这些组捕获的值。如果没有组,则返回整个匹配字符串

re.findall(模式、字符串、标志=0)

返回字符串中模式的所有非重叠匹配项,作为字符串列表。从左到右扫描字符串,并按找到的顺序返回匹配项如果模式中存在一个或多个组,则返回组列表;如果模式有多个组,这将是一个元组列表。结果中包括空匹配项,除非它们触及另一个匹配项的开头


如何直接写入regexp,使其返回['X','B','D']

您可以使用非捕获组,而不是使用捕获组:

>>> re.findall(r"(?:^|\+)([A-Z])", formula)
['X', 'B', 'D']
或者,对于这种特定情况,您可以尝试使用单词边界的更简单解决方案:

>>> re.findall(r"\b[A-Z]", formula)
['X', 'B', 'D']
或者使用不使用正则表达式的
str.split
解决方案:

>>> [s[0] for s in formula.split('+')]
['X', 'B', 'D']

啊!!我想我理解逻辑。对我来说,
re.findall(^([A-Z])|[+]([A-Z]),公式)
=>
[('X',''),('B'),('D')]
,因为第一组是定义BOL的组,第二组是
+
之后的字母。谢谢<代码>[x如果x!=''否则y代表x,y代表re.findall(“^[]*([A-Z])|[+][]*([A-Z])”,公式)]
是我需要的。