为什么此代码返回包含2个元素的元组?

时间:2019-06-10 12:30:46

标签: python regex python-3.x

my_string = "C2H6O"
a = re.findall("((Cl|H|O|C|N)[0-9]*)", my_string)
print(a)

输出为[("C2", "C"), ("H6", "H"), ("O", "O")],但我期望为["C2", "H6", "O"]

我有点理解元组,但是我觉得这段代码中没有任何内容导致元组("C2", "C")中的第二个元素。

2 个答案:

答案 0 :(得分:5)

因为您的模式包含捕获组。

来自re.findall()

  

如果模式中存在一个或多个组,则返回一个组列表;如果模式包含多个组,则这将是一个元组列表。

如果要摆脱它们,请使用以下模式:

r"(?:Cl|H|O|C|N)[0-9]*"

它会完全删除(不需要的)外部捕获组,并对字母字符使用非捕获组。

>>> re.findall(r"(?:Cl|H|O|C|N)[0-9]*", my_string)
['C2', 'H6', 'O']

答案 1 :(得分:-1)

您可以将正则表达式更改为:

re.findall("([Cl|H|O|C|N][0-9]*)", my_string)

您将得到您所期望的。这将删除一些分组。