Newb正则表达式帮助:带&符号的字符串,使用R

时间:2014-05-31 06:24:05

标签: regex r grep

我知道这应该很简单,但我无法使用regex in R从字符串返回字符子集。

  

Foo< - ' propertyid = R206411& state_id ='

     

Reg< - ' propertyid =(。*)& state_id ='

     

测试< - grep(pattern = Reg,x = Foo,value = TRUE)

这会为我捕获整个字符串,我想只捕获R206411。我想要捕获的字符串可能在长度和内容上有所不同,因此关键是让捕获在'=' in propertyid=之后开始,然后在看到'&' in '&state_id'后结束捕获。

感谢您的时间。

3 个答案:

答案 0 :(得分:1)

你必须使用正面的lookbehind和lookahead断言,如下所示:

Foo <- 'propertyid=R206411&state_id='
Reg <- gregexpr('(?<=propertyid=).*(?=&state_id=)', Foo, perl=TRUE)
regmatches(Foo, Reg)

答案 1 :(得分:1)

嗯,grep对于您正在尝试执行的捕获组不能很好地发挥作用。你可能想要的是gsub

Foo <- 'propertyid=R206411&state_id='
Reg <- 'propertyid=(.*)&state_id='
gsub(Reg, "\\1", Foo)
# [1] "R206411"

这里我们采用你的模式,我们用“\ 1”替换匹配(因为R要求我们转义反斜杠,我们加倍斜线)代表第一个捕获组(这是括号表示的)。因此,由于您匹配整个字符串,它将仅使用匹配部分替换整个字符串。

答案 2 :(得分:0)

strapplyc包中的gsubfn函数可以完全执行此操作。使用问题中的FooReg

> library(gsubfn)
>
> strapplyc(Foo, Reg, simplify = TRUE)
[1] "R206411"