在两个不同模式之间提取字符串的一部分

时间:2014-04-07 22:21:20

标签: regex r text-extraction stringr

我尝试使用stringr包来提取字符串的一部分,这是在两种特定模式之间。

例如,我有:

my.string <- "nanaqwertybaba"
left.border  <- "nana"
right.border <- "baba"

并使用str_extract(string, pattern)函数(其中pattern是由POSIX正则表达式定义)我希望收到:

"qwerty"

Google的解决方案无效。

4 个答案:

答案 0 :(得分:14)

base R中,您可以使用gsubpattern中的括号创建编号的捕获组。在这里,我们选择replacement中的第二个组,即边界之间的组。 .匹配任何字符。 *表示前面元素中有零个或多个

gsub(pattern = "(.*nana)(.*)(baba.*)",
     replacement = "\\2",
     x = "xxxnanaRisnicebabayyy")
# "Risnice"

答案 1 :(得分:8)

我不知道 stringr 提供的功能是否以及如何实现这一功能,但您也可以使用基座regexprsubstring

pattern <- paste0("(?<=", left.border, ")[a-z]+(?=", right.border, ")")
# "(?<=nana)[a-z]+(?=baba)"

rx <- regexpr(pattern, text=my.string, perl=TRUE)
# [1] 5
# attr(,"match.length")
# [1] 6

substring(my.string, rx, rx+attr(rx, "match.length")-1)
# [1] "qwerty"

答案 2 :(得分:5)

我会使用 stringr 中的str_match:&#34; str_match提取由 ()从第一场比赛开始。它返回一个字符矩阵,其中一列用于完整匹配,一列用于每个组。&#34; ref

str_match(my.string, paste(left.border, '(.+)', right.border, sep=''))[,2]

上面的代码创建了一个正则表达式,paste连接捕获1个或多个字符的捕获组(.+),左右边框(字符串之间没有空格)。

假设单个匹配。因此,[,2]str_match返回的矩阵中选择第二列。

答案 3 :(得分:0)

您可以使用软件包 unglue

library(unglue)
my.string <- "nanaqwertybaba"
unglue_vec(my.string, "nana{res}baba")
#> [1] "qwerty"