可能重复:
在 R 中的所有括号内提取信息(正则表达式)
我有一个字符串
df
Peoplesoft(id-1290)
例如,我喜欢捕捉双亲之间的字符。我喜欢从上面的例子中得到 id-1290。
我用这个:
x <- regexpr("\\((.*)\\)", df)
这给了我这样的数字
[1] 10
有没有一种简单的方法可以在 R 中使用正则表达式在括号之间抓取文本?
可能重复:
在 R 中的所有括号内提取信息(正则表达式)
我有一个字符串
df
Peoplesoft(id-1290)
例如,我喜欢捕捉双亲之间的字符。我喜欢从上面的例子中得到 id-1290。
我用这个:
x <- regexpr("\\((.*)\\)", df)
这给了我这样的数字
[1] 10
有没有一种简单的方法可以在 R 中使用正则表达式在括号之间抓取文本?
我更喜欢用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"
这是一种稍微不同的方式,使用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"