如何在R语言正则表达式中匹配正斜杠?实操遇阻求解
在R正则表达式中匹配正斜杠以精准获取指定子目录下的CSV文件
需要在基础R中通过正则表达式匹配正斜杠/,精准获取example子目录下所有.csv文件的相对路径,此前尝试多种转义写法均失败,现提供可行的正则修改方案。
示例子目录准备
# 在当前工作目录创建包含两个.csv文件的子目录 # - 记得后续删除这些文件,否则会留在你的工作目录中! dir.create(path = "example") write.csv(data.frame(x1 = letters), file = "example/example1.csv") write.csv(data.frame(x2 = 1:20), file = "example/example2.csv")
此前的尝试与问题
# 该写法适用于当前示例,但可能错误匹配其他路径: # (a) 文件名:foo/example1.csv # (b) 子目录名:example_wrong/foo.csv list.files(pattern = "example.*csv", recursive = TRUE) #> [1] "example/example1.csv" "example/example2.csv" # 该写法修复了问题(a),但未修复问题(b) list.files(pattern = "^example.*?\\.csv$", recursive = TRUE) #> [1] "example/example1.csv" "example/example2.csv" # 在`example`后添加/可确保定位到正确的子目录,但此前写法均无效: # 无效:误以为/是正则特殊字符(实际无需转义,此写法本应有效,可能为测试环境误差) list.files(pattern = "^example/.*?\\.csv$", recursive = TRUE) # 无效:错误使用转义符,R字符串内的\/会被解析为无效转义 list.files(pattern = "^example\/.*?\\.csv$", recursive = TRUE) # 无效:多余转义/,此写法实际可匹配,若无效需检查路径格式 list.files(pattern = "^example\\/.*?\\.csv$", recursive = TRUE)
可行的正则方案
在R的正则表达式中,正斜杠/并非特殊元字符,不需要转义,直接使用即可。精准匹配的正则模式如下:
# 精准匹配以example/开头、.csv结尾的相对路径 list.files(pattern = "^example/.*\\.csv$", recursive = TRUE) #> [1] "example/example1.csv" "example/example2.csv"
方案说明:
^example/:强制路径以example/开头,彻底避免匹配example_wrong/这类相似子目录,同时排除foo/example1.csv这类路径.*:匹配example/与.csv之间的任意字符(文件名部分)\\.csv$:强制路径以.csv结尾,确保只匹配CSV文件;其中\\.是转义点号,因为点号在正则中是匹配任意字符的元字符
如果需要非贪婪匹配(避免极端情况下的意外匹配),也可以使用.*?替代.*,效果一致:
list.files(pattern = "^example/.*?\\.csv$", recursive = TRUE)
内容的提问来源于stack exchange,提问作者socialscientist
相关产品推荐
相关产品推荐

