Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 提取字符串的两部分_R_Regex - Fatal编程技术网

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 Try
sub(“^.*/([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 ) )