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

时间:2010-07-08 03:16:41

标签: python regex regex-group

这可能是一个愚蠢的问题,但......

假设您有一句话:

  

快速的棕色狐狸

或者你可能会得到一句话:

  

快速的棕色狐狸跳过懒狗

简单的正则表达式(\ w *)找到第一个单词“The”并将其放在一个组中。

对于第一句话,你可以写(\ w *)\ s *(\ w *)\ s *(\ w *)\ s *(\ w *)\ s *将每个单词放在自己的单词中小组,但假设你知道句子中的单词数量。

是否可以编写一个正则表达式,将任意句子中的每个单词放入其自己的组中?如果你能做一些类似(?:( \ w *)\ s *)*的东西,让它对(\ w *)的每个实例进行分组,那会很好。但是这不起作用。

我在Python中这样做,我的用例显然比“快速棕狐”复杂一点,所以如果Regex可以在一行中做到这一点会很好,但是如果那不可能那么我就假设下一个最佳解决方案是使用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 个答案:

答案 0 :(得分:6)

您还可以在模块重新使用函数findall

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

答案 1 :(得分:5)

我不相信这是可能的。正则表达式将捕获与给定正则表达式中的括号配对...如果您只列出一个组,如'((\ w +)\ s +){0,99}',那么它将重复捕获到相同的第一个和第二组......没有为每个匹配创建新组。

你可以使用split,但只能拆分一个字符值,而不是像空白一样的字符类。

相反,你可以使用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']
>>>

答案 2 :(得分:3)

为什么在string.split执行相同操作时使用正则表达式?

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

答案 3 :(得分:1)

正则表达式无法分组到未知数量的组中。但你的情况有希望。查看“拆分”方法,它应该对您的情况有所帮助。

相关问题