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

Mar*_*ras 6 regex text-extraction r stringr

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

例如,我有:

my.string <- "nanaqwertybaba"
left.border  <- "nana"
right.border <- "baba"
Run Code Online (Sandbox Code Playgroud)

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

"qwerty"
Run Code Online (Sandbox Code Playgroud)

谷歌的解决方案无效.

Hen*_*rik 14

baseR你可以使用gsub.pattern创建编号捕获组中的括号.在这里,我们选择第二组replacement,即边界之间的组.在.比赛的任何字符.这*意味着前面的元素中有零个或多个

gsub(pattern = "(.*nana)(.*)(baba.*)",
     replacement = "\\2",
     x = "xxxnanaRisnicebabayyy")
# "Risnice"
Run Code Online (Sandbox Code Playgroud)


sgi*_*ibb 8

我不知道是否以及如何使用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"
Run Code Online (Sandbox Code Playgroud)


小智 5

我会用str_matchstringr:")由(形成str_match提取捕捉组从所述第一匹配它返回与用于完全匹配的一列和各组一列的字符矩阵." REF

str_match(my.string, paste(left.border, '(.+)', right.border, sep=''))[,2]
Run Code Online (Sandbox Code Playgroud)

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

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