正则表达式在括号之间挑选一些文本

use*_*980 10 regex r

可能重复:
在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)


Sac*_*amp 5

这是一种稍微不同的方式,使用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)