可能重复:
在R(正则表达式)中的所有括号内提取信息
我有一个字符串
DF
Peoplesoft(id-1290)
Run Code Online (Sandbox Code Playgroud)
例如,我喜欢捕获术语之间的字符.我喜欢从上面的例子中得到id-1290.
我用过这个:
x <- regexpr("\\((.*)\\)", df)
Run Code Online (Sandbox Code Playgroud)
这给了我一些数字
[1] 10
Run Code Online (Sandbox Code Playgroud)
有没有一种简单的方法可以在R中使用正则表达式在parentesis之间获取文本?
And*_*rie 31
我更喜欢用gsub()这个:
gsub(".*\\((.*)\\).*", "\\1", df)
[1] "id-1290"
Run Code Online (Sandbox Code Playgroud)
正则表达式的工作方式如下:
(.*)\\1换句话说,用后引用替换字符串中的所有文本
如果你想使用regexp而不是gsub,那么这样做:
x <- regexpr("\\((.*)\\)", df)
x
[1] 11
attr(,"match.length")
[1] 9
attr(,"useBytes")
[1] TRUE
Run Code Online (Sandbox Code Playgroud)
这将返回值11,即找到的表达式的起始位置.并注意match.length指示匹配了多少字符的属性.
你可以用attr以下方法提取:
attr(x, "match.length")
[1] 9
Run Code Online (Sandbox Code Playgroud)
然后substring用来提取字符:
substring(df, x+1, x+attr(x, "match.length")-2)
[1] "id-1290"
Run Code Online (Sandbox Code Playgroud)
这是一种稍微不同的方式,使用lookbehind/ahead:
df <- "Peoplesoft(id-1290)"
regmatches(df,gregexpr("(?<=\\().*?(?=\\))", df, perl=TRUE))
Run Code Online (Sandbox Code Playgroud)
与 Andrie 的答案不同的是,这也适用于提取括号中的多个字符串。例如:
df <- "Peoplesoft(id-1290) blabla (foo)"
regmatches(df,gregexpr("(?<=\\().*?(?=\\))", df, perl=TRUE))
Run Code Online (Sandbox Code Playgroud)
给出:
[[1]]
[1] "id-1290" "foo"
Run Code Online (Sandbox Code Playgroud)