Python - 正则表达式,列表末尾的空白元素?

时间:2014-04-17 20:39:30

标签: python regex python-3.x split

我有一个代码

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

结果

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

如何摆脱这最后一个空白元素,是什么造成的呢? 如果这是一种从字符串中删除标点符号和空格的肮脏方法,那么除了正则表达式外,我还能写出什么呢?

4 个答案:

答案 0 :(得分:2)

扩展@HamZa在comment中所说的内容,你会使用re.findall和一个负字符集:

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

答案 1 :(得分:1)

我想到的第一件事是这样的:

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

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

答案 2 :(得分:1)

您将空字符串作为列表的最后一个元素,因为RegEx在最后一个!之后拆分。它最终会给你!之前的内容以及它之后的内容,但在它之后,它根本就没有,即一个空字符串!如果你没有明智地将+添加到你的RegEx中,你可能会在字符串中间遇到同样的问题。

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

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

这将导致:

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

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

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

答案 3 :(得分:0)

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