Python 从re.findall命令中删除空字符串

Python 从re.findall命令中删除空字符串,python,regex,Python,Regex,正如您所看到的,当正则表达式接收丙烷时,它将输出两个空字符串 import re name = 'propane' a = [] Alkane = re.findall('(\d+\W+)*(methyl|ethyl|propyl|butyl)*(meth|eth|prop|but|pent|hex)(ane)', name) if Alkane != a: print(Alkane) 对于这些类型的输入,我希望从输出中删除空字符串。我不知道这个输出是什么形式的,它看起来不像一个常规的

正如您所看到的,当正则表达式接收丙烷时,它将输出两个空字符串

import re
name = 'propane'
a = []
Alkane = re.findall('(\d+\W+)*(methyl|ethyl|propyl|butyl)*(meth|eth|prop|but|pent|hex)(ane)', name)
if Alkane != a:
    print(Alkane)

对于这些类型的输入,我希望从输出中删除空字符串。我不知道这个输出是什么形式的,它看起来不像一个常规的列表

您可以使用
过滤器
删除空字符串:

[('', '', 'prop', 'ane')]
或者您可以使用列表/元组理解:

import re
name = 'propane'
a = []
Alkane = list(map(lambda m: tuple(filter(bool, m)), re.findall('(\d+\W+)*(methyl|ethyl|propyl|butyl)*(meth|eth|prop|but|pent|hex)(ane)', name)))
if Alkane != a:
    print(Alkane)
两种输出:

import re
name = 'propane'
a = []
Alkane = [tuple(i for i in m if i) for m in re.findall('(\d+\W+)*(methyl|ethyl|propyl|butyl)*(meth|eth|prop|but|pent|hex)(ane)', name)]
if Alkane != a:
    print(Alkane)

您可以使用
str.split()
str.join()
从输出中删除空字符串:

[('prop', 'ane')]
或者使用
过滤器()

表中说明包含空匹配项

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

这意味着您需要自己过滤掉空化合物。使用空字符串的错误来实现这一点

[tuple(filter(None, x)) for x in Alkane]

另外,避免使用大写的变量名,因为它们通常是为类名保留的。

您是否介意解释第二种方法的工作原理?或者甚至给我一个链接,我可以在哪里学习解释这种逻辑?这对我来说是完全无法理解的。你可以阅读关于列表理解的内容。基本上,由于
re.findall
返回一个元组列表,我们首先遍历该列表,然后对于列表中的每个元组,我们遍历元组中的每个项,以测试该项的计算结果是否为True,而空字符串则不是。
[tuple(filter(None, x)) for x in Alkane]
import re
name = 'propane'
alkanes = re.findall(r'(\d+\W+)*(methyl|ethyl|propyl|butyl)*(meth|eth|prop|but|pent|hex)(ane)', name)

alkanes = [tuple(comp for comp in a if comp) for a in alkanes]

print(alkanes) # [('prop', 'ane')]