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

Posted

技术标签:

【中文标题】提取两个不同模式之间的部分字符串【英文标题】:Extract part of string between two different patterns 【发布时间】:2014-05-20 09:22:21 【问题描述】:

我尝试使用stringr 包来提取字符串的一部分,它位于两个特定模式之间。

例如,我有:

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

通过使用str_extract(string, pattern) 函数(其中模式由 POSIX 正则表达式定义)我想收到:

"qwerty"

Google 的解决方案不起作用。

【问题讨论】:

【参考方案1】:

你可以使用包脱胶

library(unglue)
my.string <- "nanaqwertybaba"
unglue_vec(my.string, "nanaresbaba")
#> [1] "qwerty"

【讨论】:

【参考方案2】:

我会使用 stringr 中的str_match:“str_match 提取由以下组成的捕获组 () 从第一场比赛开始。它返回一个字符矩阵,其中一列用于完整匹配,每组一列。”ref

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

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

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

好吧,关键是我不知道“qwerty”确实坐在这里,我没有办法在正则表达式模式中使用它! @Marciszka:您也可以用正则表达式替换此示例中的“qwerty”,例如gsub(pattern = "(.*nana)([[:alpha:]]+)(baba.*)", "\\2", x=my.string) 至少一封信。【参考方案4】:

我不知道 stringr 提供的函数是否以及如何实现,但您也可以使用 base 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"

【讨论】:

谢谢你,sigbb!我刚刚对其进行了一点调整,以便:1.匹配left.borderright.border之间的所有字符,2.匹配right.border的第一次出现,现在我有了:rx &lt;- regexpr(paste0("(?&lt;=", left.border, ")(.*?)+(?=", right.border, ")"), text = my.string, perl = TRUE)。非常感谢你!

以上是关于提取两个不同模式之间的部分字符串的主要内容,如果未能解决你的问题,请参考以下文章

Groovy - 在两个不同的字符串之间提取字符串[重复]

提取每组两个不同字符串之间的每个字符串

两个字符串之间的 MySQL 子字符串

Linux的shell匹配模式之间提取子

如何在两个分隔符之间提取字符串[重复]

在LARGE日志文件中有效地grep两个模式之间的字符串