用于在数字之前从 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 中提取字符串的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章