2014-04-17 62 views
1

我有一个代码Python - 正则表达式,列表末尾的空元素?

print(re.split(r"[\s\?\!\,\;]+", "Holy moly, feferoni!")) 

导致

['Holy', 'moly', 'feferoni', ''] 

我怎样才能摆脱这个最后一个空白的元素,是什么原因造成的呢? 如果这是一个肮脏的方式来摆脱字符串中的标点符号和空格,除了正则表达式,我还能写什么呢?

+0

首先,没有必要为了逃避字符类'那些字符[?!\ S,] +'。你也可以通过制作一个负面的字符类'[^ \ s?!,;] +'来尝试匹配而不是分裂 – HamZa

回答

2

扩大在什么@HamZa在他comment说,你可以使用re.findall和负字符集:

>>> from re import findall 
>>> findall(r"[^\s?!,;]+", "Holy moly, feferoni!") 
['Holy', 'moly', 'feferoni'] 
>>> 
1

这使我想起的第一件事情是这样的:

>>> mystring = re.split(r"[\s\?\!\,\;]+", "Holy moly, feferoni!") 
['Holy', 'moly', 'feferoni', ''] 
>>> mystring.pop(len(mystring)-1) 

>>> print mystring 
['Holy', 'moly', 'feferoni'] 
1

你得到一个空字符串为您列出的最后一个元素,因为正则表达式的最后一个!后分裂。它最终会给你提供!之前的内容以及之后的内容,但之后就没有任何内容,即空串了!如果您不明智地将+添加到您的RegEx中,则可能在字符串中间存在相同的问题。

如果您无法使用迭代器,请致电list。如果你想优雅地摆脱了可选的空字符串,这样做:

filter(None, re.split(r"[\s?!,;]+", "Holy moly, feferoni!")) 

这将导致:

['Holy', 'moly', 'feferoni'] 

这样做是删除每一个元素是不是True值。过滤函数通常只返回满足作为函数给定要求的元素,但如果您通过None,它将检查该值本身是否为True。由于空字符串是False,而其他所有字符串都是True,因此它将从列表中删除每个空字符串。

另请注意我删除了字符类中特殊字符的转义,因为它不是必需的,只是使得RegEx难以阅读。

0
__import__('re').findall('[^\s?!,;]+', 'Holy moly, feferoni!')