我有一个文件名为
gameofdice-017-1.txt
我想知道如何使用gsub只选择017?这可能是一个重复的问题,但我很难找到答案。任何帮助将不胜感激。
epfja78i1#
我们假设这里的一般情况是正好有两个负号和它们之间的一些数字。如果需要字符结果,则减号之间的字符可以是非数字。
**1)**使用带有减号分隔符的read.table,并选择第二个字段。如果你想要一个数字返回值,忽略colclasses=参数。
x <- "gameofdice-017-1.txt" read.table(text = x, sep = "-", colClasses = "character")$V2 ## [1] "017"
**2)**或使用sub匹配每个字段并将其替换为捕获组。如果需要字符结果“017”,请忽略as.numeric
sub
as.numeric
as.numeric(sub(".*-(.*)-.*", "\\1", x)) ## [1] 17
**3)**或修剪非负号的两端,然后修剪减号的两端。如上所述,如果需要字符结果,请删除as.numeric。
as.numeric(trimws(trimws(x, whitespace = "[^-]"), whitespace = "-")) ## [1] 17
**4)**将each -替换为/,将其转换为路径,然后提取目录名,然后提取基名,基名是剩余路径的最后一部分。如果需要字符结果,请省略as.numeric。
as.numeric(basename(dirname(chartr("-", "/", x)))) ## [1] 17
**5)**或提取捕获组(括号内匹配的部分)
library(gsubfn) strapplyc(x, "-(.*)-", simplify = TRUE) ## [1] "017"
如果你想要一个数字结果
strapply(x, "-(.*)-", as.numeric, simplify = TRUE) ## [1] 17
5m1hhzi42#
您可以使用捕获组:
x <- "gameofdice-017-1.txt" value <- gsub("^[^-]+-([^-]+)-[^-]+$","\\1",x)
[^-]字符类匹配除-以外的任何字符。第二个[^-]+周围的括号(匹配一个或多个不等于-的字符)形成一个捕获组,\\1计算为第一个(也是唯一的)捕获组。如果希望值为整数,可以将调用 Package 在as.integer(...)中。
[^-]
-
[^-]+
\\1
as.integer(...)
wbgh16ku3#
下面是一个适用于数据包文件名处理的tidyverse解决方案:
library(dplyr) library(stringr) c("gameofdice-017-1.txt", "gameofdice-018-1.txt") %>% str_split("-") %>% lapply(FUN = function(x) x[2]) %>% unlist
3条答案
按热度按时间epfja78i1#
我们假设这里的一般情况是正好有两个负号和它们之间的一些数字。如果需要字符结果,则减号之间的字符可以是非数字。
**1)**使用带有减号分隔符的read.table,并选择第二个字段。如果你想要一个数字返回值,忽略colclasses=参数。
**2)**或使用
sub
匹配每个字段并将其替换为捕获组。如果需要字符结果“017”,请忽略as.numeric
**3)**或修剪非负号的两端,然后修剪减号的两端。如上所述,如果需要字符结果,请删除
as.numeric
。**4)**将each -替换为/,将其转换为路径,然后提取目录名,然后提取基名,基名是剩余路径的最后一部分。如果需要字符结果,请省略as.numeric。
**5)**或提取捕获组(括号内匹配的部分)
如果你想要一个数字结果
5m1hhzi42#
您可以使用捕获组:
[^-]
字符类匹配除-
以外的任何字符。第二个[^-]+
周围的括号(匹配一个或多个不等于-
的字符)形成一个捕获组,\\1
计算为第一个(也是唯一的)捕获组。如果希望值为整数,可以将调用 Package 在
as.integer(...)
中。wbgh16ku3#
下面是一个适用于数据包文件名处理的tidyverse解决方案: