从字符串

时间:2015-04-22 13:16:51

标签: regex r perl

我有一个带有几个括号的文本,我想从第一个括号中提取文本,例如:在下面的字符串中我想得到“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学到了一些基础知识,我正在寻找更多的例子。

谢谢。

1 个答案:

答案 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"