2017-08-02 175 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"