我尝试使用stringr
包来提取字符串的一部分,这是在两种特定模式之间。
例如,我有:
my.string <- "nanaqwertybaba"
left.border <- "nana"
right.border <- "baba"
并使用str_extract(string, pattern)
函数(其中pattern是由POSIX正则表达式定义)我希望收到:
"qwerty"
Google的解决方案无效。
答案 0 :(得分:14)
在base
R中,您可以使用gsub
。 pattern
中的括号创建编号的捕获组。在这里,我们选择replacement
中的第二个组,即边界之间的组。 .
匹配任何字符。 *
表示前面元素中有零个或多个
gsub(pattern = "(.*nana)(.*)(baba.*)",
replacement = "\\2",
x = "xxxnanaRisnicebabayyy")
# "Risnice"
答案 1 :(得分:8)
我不知道 stringr 提供的功能是否以及如何实现这一功能,但您也可以使用基座regexpr
和substring
:
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"