10

可能重复:
在 R 中的所有括号内提取信息(正则表达式)

我有一个字符串

df

Peoplesoft(id-1290)

例如,我喜欢捕捉双亲之间的字符。我喜欢从上面的例子中得到 id-1290。

我用这个:

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

这给了我这样的数字

[1] 10

有没有一种简单的方法可以在 R 中使用正则表达式在括号之间抓取文本?

4

2 回答 2

33

我更喜欢用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"
于 2012-11-21T17:36:41.203 回答
5

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

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

与安德烈的回答不同的是,这也适用于在括号中提取多个字符串。例如:

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

给出:

[[1]]
[1] "id-1290" "foo" 
于 2012-11-21T18:19:26.403 回答