2011-10-01 107 views
25

我试图从一个字符串中解析单词并将它们放入数组中。我试过以下东西:Ruby:从字符串中提取单词

@string1 = "oriented design, decomposition, encapsulation, and testing. Uses " 
puts @string1.scan(/\s([^\,\.\s]*)/) 

它似乎是做的伎俩,但它有点不稳定(我应该包括更多的特殊字符为例)。在ruby中有更好的方法吗?

可选:我有一个cs课程描述。我打算从中提取所有单词并将它们放入一个字符串数组中,从生成的数组中删除英语中最常见的单词,然后将其余单词用作用户可用于搜索cs的标签培训班。

+2

英文很难用正则表达式来解析。你有没有考虑过自然语言解析器?它会更准确地认识到句子“史密斯在这里“,并将”Mr.“作为单个单词返回,包括点,但是”here“没有点。 –

+0

@MarkByers,非常好,我没有在这一点上。我会仔细看看的。谢谢! – sybohy

回答

53

split命令。

words = @string1.split(/\W+/) 

将根据正则表达式将字符串拆分为数组。 \ W表示任何“非单词”字符,“+”表示组合多个分隔符。

+0

工程真棒!谢谢! – sybohy

+0

在Python中有直接的东西吗?谢谢! – Navneet

+4

这并不总是有效。 “CaféRestaurant”.split(/ \ W + /)=> [“Caf”,“Restaurant”]会丢弃特殊字符。 – Swards

12

嗯,你可以,如果这是你的兴趣

@string1.split(' ') 

或拆分单词边界分隔符

\W # Any non-word character 

\b # Any word boundary character 

或者非话

\s # Any whitespace character 

劈在空格串提示:尝试在http://rubular.com

,并注意Ruby 1.9的为1.8

+1

正如david nehme的回答中所指出的那样,您可能希望使用+运算符来表示与该模式匹配的一个或多个连续字符 – BF4

+0

此外,扫描对于从文本中提取匹配模式并且可以使用我们上面的分拆建议的反面例如s.scan(/ w + /) – BF4

+0

感谢您的许多伟大的建议!今天早上我用了许多红宝石,这是一个了不起的教学工具。我只是无法将选定模式提取到我的代码中。 @ string1.split(%r {\ W +})似乎工作得很好,但Mark Byers(上面的评论)对自然语言解析有很好的意义,所以我需要牢记它。无论如何,谢谢! – sybohy

1

一定的差异对于Rails开发,你可以使用这样的事情:

@string1.split(/\s/).delete_if(&:blank?) 
10

对我来说最好的劈裂的句子是:

line.split(/[^[[:word:]]]+/) 

即使用多语言词汇和标点符号完美工作:

line = 'English words, Polski Żurek!!! crème fraîche...' 
line.split(/[^[[:word:]]]+/) 
=> ["English", "words", "Polski", "Żurek", "crème", "fraîche"] 
+0

谢谢。适用于非拉丁文字。 –

+0

宫缩怎么样? – Pachonk

+0

[“can”,“t”]处理收缩 – JLB

相关问题