我有一个字符串
DF
Peoplesoft(id-1290)
例如,我喜欢在肠胃外检查之间捕获角色。我喜欢从上面的例子中得到id-1290。
我用过这个:
x <- regexpr("\\((.*)\\)", df)
这给了我像
这样的数字[1] 10
是否有一种简单的方法可以在R?
中使用正则表达式在parentesis之间获取文本答案 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"