我需要在 +
符号之后或在字符串的开头提取所有字母,如下所示:
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']
?
答案 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']