2017-08-02 55 views
2

我知道這個問題已經在幾個地方問過了,但我沒有看到這個問題的確切答案。正則表達式R str_extract:從字符串中提取正好第n個詞

所以我試圖在正則表達式的幫助下從R中的字符串(「試圖」)中提取第二個單詞。我不想使用不公開(strsplit)

sen= "I am trying to substring here something, but I am not able to" 

str_extract(sen, "trying to\\W*\\s+((?:\\S+\\s*){2})") 

理想我想「這裏」作爲輸出,但我正在逐漸「想在這裏串」

請幫我

+0

爲什麼'here'是你需要提取什麼呢?這不是句子中的第3個單詞。在'嘗試'+ 1個或更多空格之後,你想抽取一連串非空白字符嗎? –

+0

@WiktorStribiżew..抱歉,我編輯了我的錯誤 –

+0

嘗試'str_match(sen,「嘗試\\ W + \\ S + \\ W +(\\ S +)」)[,2]'或'str_match( sen,「試圖\\ s + \\ S + \\ s +(\\ S +)」)[,2]' –

回答

2

你實際上可能捕獲你需要str_match字:

str_match(sen, "trying to\\W+\\S+\\W+(\\S+)")[,2] 

或者

str_match(sen, "trying to\\s+\\S+\\s+(\\S+)")[,2] 

這裏,\S+匹配1個或多個不同於空格的字符,並且\W+匹配除字詞之外的一個或多個字符,並且\s+匹配1+個空格。

請注意,如果您的「單詞」以多於空白(例如,標點符號)分隔,請使用\W+。否則,如果只有空格,請使用\s+

[,2]將訪問第一個捕獲值(與第一對非括號括號內的模式部分相匹配的部分文本)。

0

您可以使用strsplit。首先將sen分爲"trying to "兩部分,然後提取第二部分的第二個單詞。

sapply(strsplit(sen, "trying to "), function(x) unlist(strsplit(x[2], " "))[2]) 
#[1] "here" 
1

我們可以使用sub

sub("^.*\\btrying to\\s+\\w+\\s+(\\w+).*", "\\1", sen) 
#[1] "here" 
2

既然你也標記stringr,我將張貼word解決方案,

library(stringr) 

word(sub('.*trying to ', '', sen), 2) 
#[1] "here"