我有一个带有几个括号的文本,我想从第一个括号中提取文本,例如:在下面的字符串中我想得到“int1”
string <- "string1(int1)string2(int2)string3(int3)"
我对正则表达式一无所知,我的问题是我不知道如何停在第一个“(”和“)”,在下面的示例中,当我严格匹配字符时,它在第1个停止字符串(ofc使用sub
而不是gsub
)。但是当我在我的角色之前使用“。*”时,它会匹配字符串中它的最后一次出现。
sub("\\(", "X", string, perl = TRUE)
#[1] "string1Xint1)string2(int2)string3(int3)"
sub(".*\\(", "X", string, perl = TRUE)
#[1] "Xint3)"
sub(".*\\)", "X", string, perl = TRUE)
#[1] "X"
sub("\\)", "X", string, perl = TRUE)
#[1] "string1(int1Xstring2(int2)string3(int3)"
所以当我做sub(".*\\((.*)\\).*", "\\1", string, perl = TRUE)
之类的事情时,我在最后一个括号中得到了字符串。
我的第一个问题是:如何在sub("\\)", ...)
中的第一个“(”和“)”停止?
经过多次尝试后,我找到了一种从第一个括号中提取字符串的方法(由于()
的分组部分,我不太理解这个字符串):
string %>%
sub("(\\).*$)", "\\2", ., perl = TRUE) %>% #[1] "string1(int1"
sub(".*\\(", "", ., perl = TRUE)
#[1] "int1"
你能告诉我一个更好的解决方案吗?
你知道我在哪里可以找到关于R和Perl正则表达式的可理解的文档,我从https://www.cs.tut.fi/~jkorpela/perl/regexp.html学到了一些基础知识,我正在寻找更多的例子。
谢谢。
答案 0 :(得分:1)
您可以在regexpr
使用regmatches功能,其中regexpr
将进行一次首次匹配。
> string <- "string1(int1)string2(int2)string3(int3)"
> regmatches(string, regexpr("(?<=\\()[^()]*(?=\\))", string, perl=TRUE))
[1] "int1"
OR
> regmatches(string, regexpr("(?<=\\().*?(?=\\))", string, perl=TRUE))
[1] "int1"
OR
> gsub("\\).*|^[^()]*\\(", "", string)
[1] "int1"