用于在数字之前从 csv 中提取字符串的正则表达式

Posted

技术标签:

【中文标题】用于在数字之前从 csv 中提取字符串的正则表达式【英文标题】:Regex for extracting string from csv before numbers 【发布时间】:2022-01-10 04:05:30 【问题描述】:

我对正则表达式世界很陌生,想知道如何使用正则表达式从我导入到 R 的一堆文件名中提取字符串。我的文件遵循以下一般格式:

testing1_010000.csv
check3_012000.csv
testing_checking_045880.csv
test_check2_350000.csv

我想提取 6 个 numbers.csv 部分之前的所有内容,包括“_”以获得如下内容:

testing1_
check3_
testing_checking_
test_check2_

如果有帮助,我本质上要删除的模式将始终是 6 个数字,后跟 .csv。

任何帮助都会很棒,谢谢!

【问题讨论】:

欢迎来到“正则表达式世界”! 如果您总是删除后跟“.csv”的 6 个数字,为​​什么不只删除最后 10 个字符? 在线正则表达式生成器非常有用regex-generator.olafneumann.org 【参考方案1】:

使用nchar

Files = c("testing1_010000.csv", "check3_012000.csv",
          "testing_checking_045880.csv", "test_check2_350000.csv")

substr(Files, 1, nchar(Files)-10)

OR

library(stringr)

str_remove(Files, "\\d6.csv")
[1] "testing1_"         "check3_"           "testing_checking_"
[4] "test_check2_"

【讨论】:

【参考方案2】:

我们可以使用stringr::str_match()。它也适用于不同的六位数。

library(tidyverse)

files <- c("testing1_010000.csv", "check3_012000.csv", "testing_checking_045880.csv", "test_check2_350000.csv")



str_match(files, '(.*_)\\d+\\.csv$')[, 2]
#> [1] "testing1_"         "check3_"           "testing_checking_"
#> [4] "test_check2_"

正则表达式可以解释为: “捕获包括下划线在内的所有内容,然后以一个或多个数字 .csv 作为结尾”

由reprex package (v2.0.1) 于 2021-12-03 创建

【讨论】:

【参考方案3】:

有几种方法可以解决这个问题。例如,匹配六位数字字符串前的任何内容,后跟“.csv”。对于这个,您需要获得第一个捕获组。

/(.*)\d6.csv/

https://regex101.com/r/MPH6mE/1/

或匹配直到最后一个下划线字符的所有内容。对于这个,你会想要整场比赛。

.*_

https://regex101.com/r/4GFPIA/1

【讨论】:

这太棒了,非常感谢!最终保持简单并坚持使用 .*_ ,这与我在 R 的 str_extract 函数中使用它的方式完美配合。【参考方案4】:
Files = c("testing1_010000.csv", "check3_012000.csv",
    "testing_checking_045880.csv", "test_check2_350000.csv")
sub("(.*_)[[:digit:]]6.*", "\\1", Files)

 
[1] "testing1_"         "check3_"           "testing_checking_"
[4] "test_check2_"

【讨论】:

以上是关于用于在数字之前从 csv 中提取字符串的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

用于解析 CSV 的正则表达式

使用 sed 和正则表达式从字符串中提取数字

使用正则表达式从字符串中提取数字和符号

从字符串中提取分数、小数和数字的正则表达式[关闭]

正则表达式 - 从字符串中提取第二个位置数字

使用java创建正则表达式以从字符串中提取4位数字