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

Posted

技术标签:

【中文标题】如何为句子中的每个单词分组?【英文标题】:How to make a group for each word in a sentence? 【发布时间】:2011-03-13 03:26:30 【问题描述】:

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

假设你有这样一句话:

快速的棕色狐狸

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

敏捷的棕狐跳过了懒狗

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

对于第一句话,你可以写成 (\w*)\s*(\w*)\s*(\w*)\s*(\w*)\s* 将每个单词放在自己的位置组,但前提是您知道句子中的单词数。

是否可以编写一个正则表达式,将任意句子中的每个单词放入自己的组中?如果您可以执行类似 (?:(\w*)\s*)* 之类的操作来将 (\w*) 的每个实例分组,那就太好了,但这不起作用。

我在 Python 中执行此操作,而且我的用例显然比“The quick brown fox”要复杂一些,因此如果 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']

【问题讨论】:

我认为每次在上面输入“\s*”时都需要“\s+”。我不确定您是否可以一次匹配并捕获所有单词。 .NET 在匹配中保持一组重复捕获;我认为到目前为止,这种风味是独一无二的。 很高兴知道,我偶尔会使用 C#,并且会记住这一点。有关于该功能的任何文档的链接吗? 【参考方案1】:

我不相信这是可能的。正则表达式将捕获与给定正则表达式中的括号配对...如果您只列出一个组,例如 '((\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']
>>>

【讨论】:

谢谢,我的结论也差不多。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

string.split 做同样的事情时为什么要使用正则表达式?

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

【讨论】:

主要是因为我的用例稍微复杂一些,而且 Regex 似乎最适合它。我实际上想要做的是从这样的字符串中获取 test1、test2、test3 等的每个实例: >>> 1 0 5 test1 5 test2 5 test3 5 test4 5 test5 where ("x testn")可以重复任意次数,“x”是“testn”中的字符数,前面的“1 0”是无用的垃圾。

以上是关于如何为句子中的每个单词分组?的主要内容,如果未能解决你的问题,请参考以下文章

如何为列表中的每个项目添加一个布尔值?

如何使用聚类对具有相似意图的句子进行分组?

如何为 NLTK 中的歧义句子生成多个解析树?

使用 Weka 进行句子分类

使用python将句子中的每个单词替换为单词索引

动画改变字宽