2015-11-08 41 views
1

,而不是替换字符串在此字符串:提取物中的R

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

我怎样才能优雅地提取并q反转结构\\d+t\\d+获得:

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

我知道这是很简单的更换它用于新结构使用:

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

但是我没有发现什么simi以执行提取而不是替换。我查看了基本功能和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

+0

类似'lapply(regmatches(Q,gregexpr( “(\\ d +)T(\\ d +)”, q)),function(x)gsub(“(\\ d +)t(\\ d +)”,“\\ 2X \\ 1”,x))?? – lukeA

+0

仅仅因为花了我一些时间才发现,另一个用stringr:'lapply(str_split(str_extract_all(q,“(\\ d +)t(\\ d +)”)[[1]],“t”),函数(x)paste(x [2], “X”,x [1],sep =“”))' – vaettchen

回答

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"))