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

标签 python regex

我想使用-, +=, ==, =, 来拆分字符串>+ 和空格作为分隔符。我想保留分隔符,除非它是空格。

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

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/

相关文章:

javascript - 字符串结尾的 RegEx 测试?

c# - 高级 regex.replace 处理

python - 将 C++ 代码转换为 Python 的正确方法

python - Bloomberg Desktop Api v3 Python 2.7 添加历史数据到列表

python - 如何按区间索引分组,在列表列表上聚合均值,并加入另一个数据框?

Python - 任何检查数字 0 或 False 的方法

ruby - 搜索字符串返回多个可变长度 Ruby 正则表达式的所有重叠事件的索引

python - Django 类别及其子类别

c++ - gcc 4.8 或更早版本是否存在关于正则表达式的问题?

c# - 如何使用 RegEx 提取 Skype 帐户