我正在努力找出一个正则表达式,它可以匹配前面有字母或数字的字符串中的最后一个三重下划线。最终,我希望能够提取这个匹配之前和之后的字符。我还需要用base R来完成这个任务
x <- c("three___thenfour____1",
"only_three___k")
我最接近的是尝试适应Regex Last occurrence?
sub("^(.+)___(?:.(?!___))+$", "\\1", x, perl = TRUE)
[1] "three___thenfour_" "only_three"
但我真正想得到的是c("three___thenfour", "only_three")
和c("_1", "k")
(The到目前为止,我获得这些结果的唯一方法是通过strsplit
,但它感觉笨拙且效率低下)
do.call("rbind",
lapply(strsplit(x, "___"),
function(x){
c(paste0(head(x, -1), collapse = "___"), tail(x, 1))
}))
[,1] [,2]
[1,] "three___thenfour" "_1"
[2,] "only_three" "k"
有什么建议吗?
3条答案
按热度按时间piok6c0g1#
这符合您当前的要求:
它输出:
说明:
^(.*?)___
-在开始时非贪婪地匹配任何内容,然后将___
分配到第一组(?!.*___)
-在此之后,不允许___
前面有任何内容,负先行用于此目的(.*)$
-将字符串末尾之后的任何内容匹配到第二组pkwftd7m2#
您可以使用
regexpr
与.*[^_]___
匹配从左开始计数的最后一个___
-.*___
将匹配从右开始计数的最后一个。使用regmatches
提取第一部分,使用substring
提取最后一部分。r1wp621o3#
你可以试试这个
最后得到向量