2011-10-01 173 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

相關問題