匹配单词及后续空白的正则表达式

1 投票
3 回答
2020 浏览
提问于 2025-04-17 05:56

我有一段文本:

"    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)

撰写回答