2017-02-25 90 views
1

我在R中使用正則表達式,但我希望它是貪婪的左邊部分和非貪婪的右邊部分。假設我想提取單詞「左」和「右」之間的文本,但我希望它是貪婪的,並繼續在文本中查找單詞「左」,直到找到最後一次出現爲止。但是,我也希望它對於「正確」不會貪婪,並在第一次出現時停下來。我如何更改此代碼?一個部分貪婪的正則表達式,其他貪婪

gsub(".*left(.*)right.*", string)

作爲替代方案,我存入R使用regexpr字的位置,是有可能使用位置x和位置y之間的正則表達式?

回答

1

如果R中的正則表達式與Perl兼容,那麼添加一個?後面*(或+),使該部分非貪婪:

Input: aaaabaaaaab 
Regex: `/a*?b/` 
Result: aaaab 
+0

如果我有'aaaabbbbb',我只是想'ab'?即我希望它在b上貪婪和不貪婪。 – vdvaxel

+0

然後,只是說/ ab /或/ a +?b +/ – Psi

1
string <- "A left bat ran after a left dog who is right but not too right." 
gsub("^.*left(.*?)right.*$", "\\1", "string) 

圖案.*left將貪婪地消耗一切直到最後發生left,圖案(.*?)right將消耗一切直到第一個發生right

演示在這裏:

Regex101

+0

這是不是返回'蝙蝠跑了一隻左狗是誰?如果我想'狗誰是'呢? – vdvaxel

+0

這將返回'誰是'的狗 –

0

這裏另一種方法是使用stringi包。功能stri_replace_laststri_replace_first做的正是你所需要的,即(來自@添的回答使用string),

library(stringi) 

stri_replace_first(stri_replace_last(string, '', regex = '.*left '), '', regex = ' right.*') 
#[1] "dog who is"