正则表达式在括号中选择一些文本

时间:2012-11-21 17:32:05

标签: regex r

  

可能重复:
  Extract info inside all parenthesis in R (regex)

我有一个字符串

DF

Peoplesoft(id-1290)

例如,我喜欢在肠胃外检查之间捕获角色。我喜欢从上面的例子中得到id-1290。

我用过这个:

x <- regexpr("\\((.*)\\)", df) 

这给了我像

这样的数字
[1] 10

是否有一种简单的方法可以在R?

中使用正则表达式在parentesis之间获取文本

2 个答案:

答案 0 :(得分:29)

我更喜欢使用gsub()

gsub(".*\\((.*)\\).*", "\\1", df)
[1] "id-1290"

正则表达式的工作原理如下:

  • 在括号内查找文字 - 不是真正的括号,而是我的额外括号,即(.*)
  • 将此作为反向引用\\1
  • 返回

换句话说,用后引用

替换字符串中的所有文本

如果您想使用regexp而不是gsub,请执行以下操作:

x <- regexpr("\\((.*)\\)", df)
x

[1] 11
attr(,"match.length")
[1] 9
attr(,"useBytes")
[1] TRUE

返回值11,即找到的表达式的起始位置。并注意属性match.length,表示匹配了多少个字符。

您可以使用attr

提取此内容
attr(x, "match.length")
[1] 9

然后使用substring提取字符:

substring(df, x+1, x+attr(x, "match.length")-2)
[1] "id-1290"

答案 1 :(得分:4)

这是一种略有不同的方式,使用lookbehind / ahead:

df <- "Peoplesoft(id-1290)"
regmatches(df,gregexpr("(?<=\\().*?(?=\\))", df, perl=TRUE))

与Andrie的答案不同的是,这也可以在括号中提取多个字符串。 e.g:

df <- "Peoplesoft(id-1290) blabla (foo)"
regmatches(df,gregexpr("(?<=\\().*?(?=\\))", df, perl=TRUE))

给出:

[[1]]
[1] "id-1290" "foo"