我有一个代码Python - 正则表达式,列表末尾的空元素?
print(re.split(r"[\s\?\!\,\;]+", "Holy moly, feferoni!"))
导致
['Holy', 'moly', 'feferoni', '']
我怎样才能摆脱这个最后一个空白的元素,是什么原因造成的呢? 如果这是一个肮脏的方式来摆脱字符串中的标点符号和空格,除了正则表达式,我还能写什么呢?
我有一个代码Python - 正则表达式,列表末尾的空元素?
print(re.split(r"[\s\?\!\,\;]+", "Holy moly, feferoni!"))
导致
['Holy', 'moly', 'feferoni', '']
我怎样才能摆脱这个最后一个空白的元素,是什么原因造成的呢? 如果这是一个肮脏的方式来摆脱字符串中的标点符号和空格,除了正则表达式,我还能写什么呢?
扩大在什么@HamZa在他comment说,你可以使用re.findall
和负字符集:
>>> from re import findall
>>> findall(r"[^\s?!,;]+", "Holy moly, feferoni!")
['Holy', 'moly', 'feferoni']
>>>
这使我想起的第一件事情是这样的:
>>> mystring = re.split(r"[\s\?\!\,\;]+", "Holy moly, feferoni!")
['Holy', 'moly', 'feferoni', '']
>>> mystring.pop(len(mystring)-1)
>>> print mystring
['Holy', 'moly', 'feferoni']
你得到一个空字符串为您列出的最后一个元素,因为正则表达式的最后一个!
后分裂。它最终会给你提供!
之前的内容以及之后的内容,但之后就没有任何内容,即空串了!如果您不明智地将+
添加到您的RegEx中,则可能在字符串中间存在相同的问题。
如果您无法使用迭代器,请致电list
。如果你想优雅地摆脱了可选的空字符串,这样做:
filter(None, re.split(r"[\s?!,;]+", "Holy moly, feferoni!"))
这将导致:
['Holy', 'moly', 'feferoni']
这样做是删除每一个元素是不是True
值。过滤函数通常只返回满足作为函数给定要求的元素,但如果您通过None
,它将检查该值本身是否为True
。由于空字符串是False
,而其他所有字符串都是True
,因此它将从列表中删除每个空字符串。
另请注意我删除了字符类中特殊字符的转义,因为它不是必需的,只是使得RegEx难以阅读。
__import__('re').findall('[^\s?!,;]+', 'Holy moly, feferoni!')
首先,没有必要为了逃避字符类'那些字符[?!\ S,] +'。你也可以通过制作一个负面的字符类'[^ \ s?!,;] +'来尝试匹配而不是分裂 – HamZa