我想分割使用字符串-
,+=
,==
,=
,+
作为分隔符,和空格.我想保留分隔符,除非它是空白区域.
我已尝试使用以下代码实现此目的:
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)
这几乎是我想要的,除了有很多无关的None
s和空字符串.
为什么它会以这种方式运行,我怎么能改变它以获得我想要的东西?
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,如果您愿意)可以轻松丢弃None
s 和空字符串:
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对这里的一些选项有很好的概述。
归档时间: |
|
查看次数: |
92 次 |
最近记录: |