如何为句子中的每个单词分组?

4 投票
4 回答
4708 浏览
提问于 2025-04-16 00:58

这可能是个傻问题,不过……

假设你有一句话,比如:

敏捷的棕色狐狸

或者你可能会遇到这样的句子:

敏捷的棕色狐狸跳过了懒狗

简单的正则表达式 (\w*) 可以找到第一个单词 "敏捷的" 并把它放到一个组里。

对于第一句,你可以写 (\w*)\s*(\w*)\s*(\w*)\s*(\w*)\s* 来把每个单词放到自己的组里,但这需要你知道句子里有多少个单词。

有没有办法写一个正则表达式,把任何句子里的每个单词都放到自己的组里呢?如果能像这样写 (?:(\w*)\s*)* 来把每个 (\w*) 都分组,那就太好了,但这样是不行的。

我在用 Python,实际上我的需求比 "敏捷的棕色狐狸" 要复杂一些,所以如果正则表达式能一行搞定那就太棒了,但如果不行,我想最好的办法就是用 re.findall() 或类似的方法来遍历所有匹配项。

谢谢你们的任何建议。

补充:为了完整起见,这里是我的实际用例,以及我如何在你们的帮助下解决它。再次感谢。

>>> s = '1 0 5 test1 5 test2 5 test3 5 test4 5 test5'
>>> s = re.match(r'^\d+\s\d+\s?(.*)', s).group(1)
>>> print s
5 test1 5 test2 5 test3 5 test4 5 test5
>>> list = re.findall(r'\d+\s(\w+)', s)
>>> print list
['test1', 'test2', 'test3', 'test4', 'test5']

4 个回答

3

为什么要用正则表达式,而不是直接用string.split,因为它们的功能是一样的呢?

>>> "The quick brown fox".split()
['The', 'quick', 'brown', 'fox']
6

你还可以使用模块re中的findall函数。

import re
>>> re.findall("\w+", "The quick brown fox")
['The', 'quick', 'brown', 'fox']
4

我觉得这不太可能实现。正则表达式(Regex)会把捕获的内容和括号里的部分对应起来。如果你只列出一个组,比如 '((\w+)\s+){0,99}',那么它只会不断地把内容捕获到同一个第一组和第二组里,而不会为每次找到的匹配项创建新的组。

你可以使用分割功能,但那只能在一个字符上进行分割,而不能像空格这样的字符类别。

相反,你可以使用 re.split,这个可以根据正则表达式进行分割,并且可以用 '\s' 来匹配任何空白字符。你可能想用 '\s+' 来贪婪地匹配空白字符。

>>> import re
>>> help(re.split)
Help on function split in module re:

split(pattern, string, maxsplit=0)
    Split the source string by the occurrences of the pattern,
    returning a list containing the resulting substrings.

>>> re.split('\s+', 'The   quick brown\t fox')
['The', 'quick', 'brown', 'fox']
>>>

撰写回答