2016-01-17 26 views
2

我有以下的數據幀:使用stringr來提取文本串的一個或多個單詞中的R

df <- data.frame(city=c("in London", "in Manchester city", "in Sao Paolo")) 

我使用str_extract和後返回字在一個單獨的列「中」。

library(stringr) 
str_extract(df$city, '(?<=in\\s)\\w+') 

這對95%的案例適合我。然而,在上面的例子中,「Sao Paolo」就是我的正則表達式返回「Sao」而不是城市名稱的地方。

是否有人可以幫我修改它來捕捉之一:

1)一切的文本字符串我從提取的結束? OR

2),其中有「在」後,多個單詞,然後返回太

非常感謝。

+1

你只想'(?<=在\\ s)。+'?或'(?<= in \\ s)\\ w +(?:\\ s + \\ p {Lu} \\ p {L} *)?'?看起來你會比較安全,使用'(?<=在\\ s)\\ p {Lu} \\ p {L} *(?:\\ s + \\ p {Lu} \\ p {L} *) *'。 –

+0

爲什麼不只是'gsub('^ in','',df $ city)' – rawr

+1

爲什麼它的價值,你的正則表達式在「Sao Paolo」中沒有選擇「Paolo」的原因是因爲空間不是算作一個單詞字符,所以'\\ w +'在到達該空間時停止。您在調整時要小心,因爲如果您只是允許空格,那麼您最終會捕獲「曼城」而不是「曼徹斯特」。 – brittenb

回答

1

要第一in遵循的空間後,匹配字符串的所有其餘部分,可以使用

(?<=in\\s).+ 

的回顧後的in介詞匹配與後一個空白,但不內歸還從後向看來的匹配是零寬度斷言

1

這一套班輪是否適合你?

unlist(lapply(strsplit(c("in London", "in Sao Paulo", "in Manchester City"), "in "), function(x) x[2])) 
[1] "London"   "Sao Paulo"  "Manchester City" 
0

你可以試試這個:

library(stringr) 
df$onlyCity <- str_extract(df$city, '[^in ](.)*') 
df 
       city  onlyCity 
1   in London   London 
2 in Manchester city Manchester city 
3  in Sao Paolo  Sao Paolo 
0
gsub("^in[ ]*(.*$)", "\\1", df$city) 
[1] "London"   "Manchester city" "Sao Paolo" 

假設你的字符串與"in"開始,其次是一些數量的空格(不會失敗,不止一個),其次是感興趣的文本從第一個非空白字符捕獲直到字符串的末尾。

相關問題