2015-03-12 3 views
1

У меня есть несколько строк в этом формате. Сепаратор - тире (-), и каждая «вещь» между ними является маркером.Замена шаблонов в строке

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" 

Я хочу, чтобы идентифицировать случаи, где маркеры, содержащие букву «Я» происходит в строке (т.е. маркеры 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" 

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

+1

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

ответ

4

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

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

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

Я придумал нечто похожее '' I (\\ d) - (?! [^ I]) ',' I \\ 1''; так как вы уже ответили на это, может быть, вы можете мне сказать, есть ли какое-либо преимущество в том, чтобы использовать здесь postive lookbehind против отрицательного взгляда? –

+0

Не так много преимуществ, возможно, меньше назад. – hwnd

Смежные вопросы