我有一长串要标准化的文件。字符串的不同部分由下划线分隔。但是,创建了大量文件时,数字(唯一ID)和单个字母字符之间没有下划线。每个文件的特定变量将不同,但模式相同。如何在其中添加_
?
我尝试过gsub
。它正确地选择了模式(仅更改需要更改的字符串),但是替换是模式匹配代码。
x<- c("A12_SITE_1234_J_vvv.csv","A12_SITA_1234J_vvv.csv", "A12_SITE_1678_H_vvv.csv", "A12_SITE_145C_vvv.csv")
z<- gsub(".*[0-9][A-Z]", ".*[0-9]\\_[A-Z]", x)
预期结果:
"A12_SITE_1234_J_vvv.csv","A12_SITA_1234_J_vvv.csv", "A12_SITE_1678_H_vvv.csv", "A12_SITE_145_C_vvv.csv"
当前结果:
"A12_SITE_1234_J_vvv.csv" ".*[0-9]_[A-Z]_vvv.csv" "A12_SITE_1678_H_vvv.csv" ".*[0-9]_[A-Z]_vvv.csv"
答案 0 :(得分:3)
我们可以使用正则表达式环视
sub("(?<=[0-9])(?=[A-Z])", "_", x, perl = TRUE)
#[1] "A12_SITE_1234_J_vvv.csv" "A12_SITA_1234_J_vvv.csv"
#[3] "A12_SITE_1678_H_vvv.csv" "A12_SITE_145_C_vvv.csv"
或与捕获组((..)
)一起捕获模式,然后在替换中使用捕获组的后向引用(\\1, \\2
)
sub("([0-9])([A-Z])", "\\1_\\2", x, perl = TRUE)
在OP的代码中,未捕获模式.*
(任何字符)后跟数字([0-9]
)和字母([A-Z]
),因此在模式中丢失替代。另外,在替换中,如果我们使用[0-9]
,它将被当作文字字符串
答案 1 :(得分:2)
在替换模式中使用capturing group和backrefences(注意,替换模式不能是正则表达式模式,只能使用正则表达式搜索某些文本):
> sub("(.*[0-9])([A-Z])", "\\1_\\2", x)
[1] "A12_SITE_1234_J_vvv.csv" "A12_SITA_1234_J_vvv.csv" "A12_SITE_1678_H_vvv.csv" "A12_SITE_145_C_vvv.csv"
模式详细信息
(.*[0-9])
-组1(\1
):最多0个字符,最多包含一个数字,包括一个数字([A-Z])
-第2组(\2
):大写ASCII字母。