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

时间:2018-07-08 02:57:45

标签: 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)

如您所见,正则表达式使用丙烷时,它将输出两个空字符串。

[('', '', 'prop', 'ane')]

对于这些类型的输入,我想从输出中删除空字符串。我不知道此输出采用哪种形式,它看起来不像常规列表。

3 个答案:

答案 0 :(得分:0)

您可以使用filter删除空字符串:

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)

两个输出:

[('prop', 'ane')]

答案 1 :(得分:0)

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

>>> import re
>>> name = 'propane'
>>> Alkane = re.findall('(\d+\W+)*(methyl|ethyl|propyl|butyl)*(meth|eth|prop|but|pent|hex)(ane)', name)
>>> Alkane
[('', '', 'prop', 'ane')]
>>> [tuple(' '.join(x).split()) for x in Alkane]
[('prop', 'ane')]

或使用filter()

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

答案 2 :(得分:0)

doc中声明包含空匹配项。

  

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

这意味着您将需要自己过滤掉空化合物。为此使用虚假的空字符串。

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

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