我想使用-
, +=
, ==
, =
, 来拆分字符串>+
和空格作为分隔符。我想保留分隔符,除非它是空格。
我尝试使用以下代码实现此目的:
def tokenize(s):
import re
pattern = re.compile("(\-|\+\=|\=\=|\=|\+)|\s+")
return pattern.split(s)
print(tokenize("hello-+==== =+ there"))
我期望输出是
['hello', '-', '+=', '==', '=', '=', '+', 'there']
虽然我得到了
['hello', '-', '', '+=', '', '==', '', '=', '', None, '', '=', '', '+', '', None, 'there']
这几乎是我想要的,除了有很多无关的 None
和空字符串。
为什么它会这样,我该如何改变它才能得到我想要的?
最佳答案
re.split默认情况下返回匹配之间的字符串位数组:(正如@Laurence Gonsalves 指出的那样,这是它的主要用途。)
['hello', '', '', '', '', '', '', '', 'there']
注意-
和+=
、+=
和==
等之间的空字符串。
正如文档所解释的那样,因为您正在使用捕获组(即,因为您正在使用 (\-|\+\=|\=\=|\=|\+)
而不是 (?:\-|\+\=|\=\=|\=|\+)
,捕获组匹配的位被穿插:
['hello', '-', '', '+=', '', '==', '', '=', '', None, '', '=', '', '+', '', None, 'there']
None
对应于你的模式的 \s+
一半被匹配的地方;在那些情况下,捕获组什么也没捕获。
通过查看 re.split 的文档,我没有看到一个简单的方法让它在匹配之间丢弃空字符串,尽管一个简单的列表理解(或 filter,如果你愿意)可以很容易地丢弃 无
和空字符串:
def tokenize(s):
import re
pattern = re.compile("(\-|\+\=|\=\=|\=|\+)|\s+")
return [ x for x in pattern.split(s) if x ]
最后一点:对于您目前所描述的内容,这可以正常工作,但根据您项目的发展方向,您可能需要切换到合适的解析库。 The Python wiki对此处的一些选项有很好的概述。
关于Python 正则表达式——无关的匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16488850/