如何为句子中的每个单词分组?
这可能是个傻问题,不过……
假设你有一句话,比如:
敏捷的棕色狐狸
或者你可能会遇到这样的句子:
敏捷的棕色狐狸跳过了懒狗
简单的正则表达式 (\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']
>>>