我有一个代码
print(re.split(r"[\s\?\!\,\;]+", "Holy moly, feferoni!"))
结果
['Holy', 'moly', 'feferoni', '']
如何摆脱这最后一个空白元素,是什么造成的呢? 如果这是一种从字符串中删除标点符号和空格的肮脏方法,那么除了正则表达式外,我还能写出什么呢?
答案 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!')