re.split默认情况下返回匹配之间的字符串位的数组:(正如@Laurence Gonsalves 指出的,这是它的主要用途。)
['hello', '', '', '', '', '', '', '', 'there']
注意中间的空字符串-
and +=
, +=
and ==
, etc.
正如文档所解释的,因为您正在使用捕获组(即,因为您正在使用(\-|\+\=|\=\=|\=|\+)
代替(?:\-|\+\=|\=\=|\=|\+)
,捕获组匹配的位是散布的:
['hello', '-', '', '+=', '', '==', '', '=', '', None, '', '=', '', '+', '', None, 'there']
None
对应于其中\s+
一半的模式已匹配;在这些情况下,捕获组什么也没捕获。
从查看 re.split 的文档来看,我没有看到一种简单的方法来让它丢弃匹配之间的空字符串,尽管有一个简单的列表理解(或filter,如果你愿意的话)可以轻松丢弃None
s 和空字符串:
def tokenize(s):
import re
pattern = re.compile("(\-|\+\=|\=\=|\=|\+)|\s+")
return [ x for x in pattern.split(s) if x ]
最后一点:对于您到目前为止所描述的内容,这会很好地工作,但是根据您的项目的方向,您可能需要切换到正确的解析库。Python 维基这里对一些选项有很好的概述。