在Python中使用findall和括号

时间:2012-12-12 13:28:07

标签: 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'), ('', 'D')]

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

1 个答案:

答案 0 :(得分:6)

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

  

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

     

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


  

如何直接编写正则表达式,使其返回['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']