Замена шаблонов в строке

У меня есть несколько строк в этом формате. Разделитель — тире (-), а каждая «вещь» между ними — маркер.

string <- "FA-I2-I2-I2-EX-I2-I3-FA-I1-I2-TR-I1-I2-FA-I3-I1-FAFANR-I3-I2-TR-I1-I2-I1-I2-FA-I2-I1-I3-FAQU-I1-I2-I2-I2-NR-I2-I2-NR-I1-I2-I1-NR-I3-QU-I2-I3-QUNR-I2-I1-NRQUQU-I2-I1-EX"

Я хочу определить случаи, когда маркеры, содержащие букву «I», встречаются в строке (то есть маркеры I1, I2 и I3). Затем я хочу заменить их описанием без разделителей. Например, самое начало строки должно быть преобразовано следующим образом:

FA-I2I2I2-EX

Итак, в основном все, что я хочу сделать, это удалить все тире между маркерами, содержащими «I».

Вот несколько запутанное решение:

string1 <- gsub(string, pattern = "I1", replacement = "ZI1Z")
string2 <- gsub(string1, pattern = "I2", replacement = "ZI2Z")
string3 <- gsub(string2, pattern = "I3", replacement = "ZI3Z")
string4 <- gsub(string3, pattern = "Z-Z", replacement = "")
string5 <- gsub(string4, pattern = "Z", replacement = "")

который дает:

"FA-I2I2I2-EX-I2I3-FA-I1I2-TR-I1I2-FA-I3I1-FAFANR-I3I2-TR-I1I2I1I2-FA-I2I1I3-FAQU-I1I2I2I2-NR-I2I2-NR-I1I2I1-NR-I3-QU-I2I3-QUNR-I2I1-NRQUQU-I2I1-EX"

Есть ли более элегантный способ сделать это?


person histelheim    schedule 12.03.2015    source источник
comment
два шага, возможно, лучший способ string1 <- gsub('I(\\d)', 'ZI\\1Z', string); gsub('Z-Z|Z', '', string1)   -  person rawr    schedule 12.03.2015


Ответы (1)


Итак, в основном все, что я хочу сделать, это удалить все тире между маркерами, содержащими «I».

Вы можете использовать обходные утверждения, если ваш случай настолько прост, как кажется.

gsub('(?<=I\\d)-(?=I\\d)', '', string, perl = TRUE)
# [1] "FA-I2I2I2-EX-I2I3-FA-I1I2-TR-I1I2-FA-I3I1-FAFANR-I3I2-TR-I1I2I1I2-FA-I2I1I3-FAQU-I1I2I2I2-NR-I2I2-NR-I1I2I1-NR-I3-QU-I2I3-QUNR-I2I1-NRQUQU-I2I1-EX"
person hwnd    schedule 12.03.2015
comment
Я придумал нечто подобное 'I(\\d)-(?![^I])', 'I\\1'; поскольку вы уже ответили на этот вопрос, возможно, вы можете сказать мне, есть ли какое-либо преимущество в использовании положительного просмотра назад по сравнению с отрицательным просмотром вперед? - person l'L'l; 12.03.2015
comment
Не так много преимуществ, возможно, меньше отступлений. - person hwnd; 12.03.2015