2017-02-25 216 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"