gsub用模式匹配代码而不是特定的字符串变量替换字符串

时间:2019-04-30 13:09:06

标签: r gsub

我有一长串要标准化的文件。字符串的不同部分由下划线分隔。但是,创建了大量文件时,数字(唯一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"

2 个答案:

答案 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 groupbackrefences(注意,替换模式不能是正则表达式模式,只能使用正则表达式搜索某些文本):

> 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" 

请参见R online demoregex demo

模式详细信息

  • (.*[0-9])-组1(\1):最多0个字符,最多包含一个数字,包括一个数字
  • ([A-Z])-第2组(\2):大写ASCII字母。

enter image description here