在R中提取而不是替换字符串

时间:2015-11-08 02:33:07

标签: r string string-matching

在此字符串中:

q <- "2 t1, 1t23 xxx, 32t1, 4"

如何从\\d+t\\d+优雅地提取和反转结构q以获取:

c("23X1","1X32")

我知道使用以下方法替换新结构非常简单:

gsub("(\\d+)t(\\d+)", "\\2X\\1", q)

但我发现没有类似于提取而不是替换。我查看了基本函数以及stringrstringi包。

stringr我几乎得到了我需要的东西:

str_extract_all(q, "(\\d+)t(\\d+)")

但是没有选项可以使用等同于"\\2X\\1"的东西来操纵子串。

作为一个说明性示例,在Mathematica我可以使用:

StringCases[q, RegularExpression["(\\d+)t(\\d+)"]:> "$1$2"]

有任何线索吗?

以下是相关帖子Regex matching everything that's not a 4 digit number

1 个答案:

答案 0 :(得分:3)

library(stringi)

apply(stri_match_all_regex(q, "([[:digit:]]+)t([[:digit:]]+)")[[1]], 1,
       function(x) x[3] %s+% "X" %s+% x[2])
## [1] "23X1" "1X32"

如果您愿意,可以使用较短的数字课程,但我已养成使用POSIX友好版本的习惯。

替代stringr版本(并使用paste0代替stringi中的便捷拼接运算符:

apply(stri_match_all_regex(q, "([[:digit:]]+)t([[:digit:]]+)")[[1]], 1,
       function(x) paste0(x[3:2], collapse="X"))