5

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

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

为什么当我尝试分组时它会创建元组?如何直接编写正则表达式以使其返回['X', 'B', 'D']

4

1 回答 1

7

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

re.findall(pattern, string, flags=0)

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


如何直接编写正则表达式以使其返回 ['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']
于 2012-12-12T13:29:55.620 回答