Python正则表达式 - 无关的匹配

mat*_*ots 7 python regex

我想分割使用字符串-,+=,==,=,+作为分隔符,和空格.我想保留分隔符,除非它是空白区域.

我已尝试使用以下代码实现此目的:

def tokenize(s):
  import re
  pattern = re.compile("(\-|\+\=|\=\=|\=|\+)|\s+")
  return pattern.split(s)

print(tokenize("hello-+==== =+  there"))
Run Code Online (Sandbox Code Playgroud)

我期待输出

['hello', '-', '+=', '==', '=', '=', '+', 'there']
Run Code Online (Sandbox Code Playgroud)

但是我得到了

['hello', '-', '', '+=', '', '==', '', '=', '', None, '', '=', '', '+', '', None, 'there']
Run Code Online (Sandbox Code Playgroud)

这几乎是我想要的,除了有很多无关的Nones和空字符串.

为什么它会以这种方式运行,我怎么能改变它以获得我想要的东西?

Jos*_*ley 3

re.split默认返回匹配之间的字符串位数组:(正如 @Laurence Gonsalves 指出的,这是它的主要用途。)

['hello', '', '', '', '', '', '', '', 'there']
Run Code Online (Sandbox Code Playgroud)

-注意and +=+=and==等之间的空字符串。

正如文档所解释的,因为您使用的是捕获组(即,因为您使用的(\-|\+\=|\=\=|\=|\+)是而不是(?:\-|\+\=|\=\=|\=|\+),所以捕获组匹配的位是散布的:

['hello', '-', '', '+=', '', '==', '', '=', '', None, '', '=', '', '+', '', None, 'there']
Run Code Online (Sandbox Code Playgroud)

None对应于\s+模式的一半匹配的位置;在这些情况下,捕获组什么也没捕获。

通过查看 re.split 的文档,我没有看到一种简单的方法来让它丢弃匹配之间的空字符串,尽管简单的列表理解(或filter,如果您愿意)可以轻松丢弃Nones 和空字符串:

def tokenize(s):
  import re
  pattern = re.compile("(\-|\+\=|\=\=|\=|\+)|\s+")
  return [ x for x in pattern.split(s) if x ]
Run Code Online (Sandbox Code Playgroud)

最后一点:对于您到目前为止所描述的内容,这会很好地工作,但是根据您的项目的方向,您可能需要切换到正确的解析库。 Python wiki对这里的一些选项有很好的概述。