在此字符串中:
q <- "2 t1, 1t23 xxx, 32t1, 4"
如何从\\d+t\\d+
优雅地提取和反转结构q
以获取:
c("23X1","1X32")
我知道使用以下方法替换新结构非常简单:
gsub("(\\d+)t(\\d+)", "\\2X\\1", q)
但我发现没有类似于提取而不是替换。我查看了基本函数以及stringr
和stringi
包。
在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
答案 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"))