匹配单词及后续空白的正则表达式
我有一段文本:
" Alice, Bob Charlie "
我想要获取单词的配对(如果有的话)以及它后面的空白。也就是说:
[("", " "), ("Alice,", " "), ("Bob", " "), ("Charlie", " ")]`
在Python中,我试过:
re.findall(r"(\S*)(\s*)", " Alice, Bob Charlie ")
这个方法差不多可以用,但它在最后加了一个空的配对 ("", "")
。我该怎么去掉它呢?除了用 .pop() 方法?而且,我其实不太明白为什么会有这个空配对——在匹配到Charlie后面的空白时,应该就结束了,不是吗?
补充说明:我想要的是第一个配对,也就是有单词和一些空白。最后那个配对——没有单词,也没有空白——是我想去掉的。希望能在不使用 .pop() 的情况下做到...
3 个回答
2
试着把 \s*
改成 \s+
,这样就要求至少有一个空格字符:
>>> re.findall(r"(\S*)(\s+)", " Alice, Bob Charlie ")
[('', ' '), ('Alice,', ' '), ('Bob', ' '), ('Charlie', ' ')]
2
re.findall(r"(\S+)(\s*)", " Alice, Bob Charlie ")
在 \S
后面加一个 +
符号,可以得到你可能想要的结果:
[('Alice,', ' '), ('Bob', ' '), ('Charlie', ' ')]
否则,\S*\s*
可能会在结尾匹配到空字符串:零次或多次和零次或多次也可以等于零长度。
除了 .pop()
之外,还有其他可能的方法:
[a for a in re.findall(r"(\S*)(\s*)", " Alice, Bob Charlie ") if a != ('','')]
或者:
re.findall(r"(\S*)(\s*)", " Alice, Bob Charlie ")[:-1]
这两种方法都能准确返回你需要的结果(包括开头的空格):
[('', ' '), ('Alice,', ' '), ('Bob', ' '), ('Charlie', ' ')]
2
我觉得这样做可以实现那个功能。
re.findall('(\S+|^)(\s*)', s)