R 提取字符串的两部分
假设我有以下字符串(文件名): 我知道如何提取第一个标识符,但无法同时处理第二个标识符 我目前的做法是:R 提取字符串的两部分,r,regex,R,Regex,假设我有以下字符串(文件名): 我知道如何提取第一个标识符,但无法同时处理第二个标识符 我目前的做法是: sub(".*(.{3})_VAR29380_timely(.{3}).*","\\1\\2", a) sub(".*(.{3})_VAR29380_timely(.{3}).*","\\1\\2", b) 但是,在第二种情况下,这会错误地添加.tx。您没有使用锚定并在之后及时匹配最后3个字符,而没有检查这些字符是什么(匹配任何字符) 我建议 sub("^.*/([A-Z]{3})_VAR
sub(".*(.{3})_VAR29380_timely(.{3}).*","\\1\\2", a)
sub(".*(.{3})_VAR29380_timely(.{3}).*","\\1\\2", b)
但是,在第二种情况下,这会错误地添加
.tx
。您没有使用锚定并在之后及时匹配最后3个字符,而没有检查这些字符是什么(
匹配任何字符)
我建议
sub("^.*/([A-Z]{3})_VAR\\d+_timely(_[^_.]+)?\\.[^.]*$", "\\1\\2", a)
详细信息:
^
-字符串的开头
*/
-字符串的一部分,包括最后一个/
([A-Z]{3})
-3个ASCII大写字母捕获到组1中
\u VAR\\d+\u timetime
-\u VAR
+1个或多个数字+\u timetime
([^.]+)?
-可选的第2组捕获.
+1个或多个字符,而不是.
和
\\.
-一个点
[^.]*
-除
以外的零个或多个字符
$
-字符串结束
替换模式包含对两个捕获组的2个反向引用,以将其内容插入到替换的字符串中
:
a只是另一种解决方案,与Wiktor已经在工作的解决方案不同:
library( magrittr )
data <- c( a, b )
库(magrittr)
数据%
substr(1,3)
然后通过拆分“time”和“.txt”并获取最后一个元素(可能是空字符串),获得“part”值:
部分%
sapply(尾巴,n=1)
现在只需将它们粘贴在一起即可获得结果:
output <- paste0( ID, part )
output
[1] "TKN_p1" "ZHN"
output Trysub(“^.*/([A-Z]{3})\[^/\+\[^/\\/]+)?\.[^.]*$”,“\\1\\2”,A)
可能首先测试标识符,例如stringr::stru匹配(string,'.\u p.\\\.txt')
,然后使用两个更简单的正则表达式?@WiktorStribi\\\\ ew,这对第二种情况不起作用。请参阅。你是说\u VAR29380\u time
是静态的,并且总是在字符串中?然后查看(sub(“^.*/([A-Z]{3})\u VAR\\d+\u time(\u[^.]+)?\\.[^.]*$,“\\ 1\\2”,A)
),现在它可以工作了!是的,这些部件是静态的。如果你愿意,你可以从你的评论中做出一个答案,并解释一下正则表达式?
sub("^.*/([A-Z]{3})_VAR\\d+_timely(_[^_.]+)?\\.[^.]*$", "\\1\\2", a)
a <- "X/ZHEB100/TKN_VAR29380_timely_p1.txt"
a2 <- sub("^.*/([A-Z]{3})_VAR\\d+_timely(_[^_.]+)?\\.[^.]*$", "\\1\\2", a)
a2
[1] "TKN_p1"
b <- "X/ZHEB100/ZHN_VAR29380_timely.txt"
b2 <- sub("^.*/([A-Z]{3})_VAR\\d+_timely(_[^_.]+)?\\.[^.]*$", "\\1\\2", b)
b2
[1] "ZHN"
library( magrittr )
data <- c( a, b )
ID <- strsplit( data, "/" ) %>%
sapply( tail, n = 1 ) %>%
substr( 1, 3 )
part <- strsplit( data, "timely|.txt" ) %>%
sapply( tail, n = 1 )
output <- paste0( ID, part )
output
[1] "TKN_p1" "ZHN"
output <- strsplit( data, "/" ) %>%
sapply( tail, n = 1 ) %>%
substr( 1, 3 ) %>%
paste0( strsplit( data, "timely|.txt" ) %>%
sapply( tail, n = 1 ) )