замена строки gsub кодом соответствия шаблона, а не конкретными строковыми переменными - PullRequest
0 голосов
/ 30 апреля 2019

У меня длинный список файлов, которые я хочу стандартизировать. Различные компоненты строки разделены подчеркиванием. Однако большое количество файлов было создано без подчеркивания между цифрами (уникальным идентификатором) и одним буквенным символом. Конкретные переменные будут отличаться для каждого файла, но шаблон тот же. Как мне добавить _ in?

Я пытался 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 ]

3 голосов
/ 30 апреля 2019

Мы можем использовать регулярные выражения

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], он будет восприниматься как буквенные строки

2 голосов
/ 30 апреля 2019

Используйте группу захвата с обратными ссылками в шаблоне замены (обратите внимание, что шаблоны замены не могут быть шаблонами регулярных выражений, вы можете использовать регулярное выражение только для поиска некоторого текста):

> 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 и демонстрацию regex .

Детали шаблона

  • (.*[0-9]) - Группа 1 (\1): любое число от 0 до максимально возможного числа, включая цифру
  • ([A-Z]) - Группа 2 (\2): заглавная буква ASCII.

enter image description here

...