Как мне заменить точный шаблон в строке в r?

#r #gsub

#r #gsub

Вопрос:

У меня есть этот текст.

 raw <- "this is Mapof ttMapof qwqqwMApofRt Mapofssdsd it"
  

Я хочу, чтобы результат был следующим:

 "this is Mapof (Map of) ttMapof (Map of) qwqqwMapofRt Mapof (Map of)ssdsd it"
  

Итак, вы видите, что я хочу заменить каждый «Mapof» на «Mapof (Map of)», но не тот, что в «qwqqwMapofRt».

Как мне это сделать?

Комментарии:

1. Предыдущий пример был слишком сложным. Отредактировал его и теперь добавил простой.

2. Откуда такое неожиданное поведение? sub заменяет первое совпадение pattern с replacement , что именно то, что он делает. То, что вы хотите, может быть легко достигнуто с gsub помощью : gsub('Mapof', 'Mapof (Mapof)', raw) .

3. @JoshuaUlrich но в случае, если «Mapof» происходит между ними, как в «qwertMapoferer». gsub также заменит это. Я не хочу заменять ‘Mapof’ в таких случаях. Как мне это сделать? Итак, в принципе, я хотел бы, чтобы какая-нибудь функция заменяла точный шаблон, включая пробелы, такие как ‘Mapof’, ‘Mapof’, ‘Mapof’.

4. Изменение моего вопроса в соответствии с вводными данными, предоставленными Джошем. Спасибо, Джош!

Ответ №1:

Вам нужно указать, что «Mapof» должно заканчиваться словом с использованием b :

 > raw <- "this is Mapof ttMapof qwqqwMapofRt it"
> gsub("Mapof\b", "Mapof (Map of)", raw)
[1] "this is Mapof (Map of) ttMapof (Map of) qwqqwMapofRt it"
  

От ?regex :

Символ b соответствует пустой строке на любом краю слова

Редактировать: если вы хотите, чтобы строка соответствовала либо концу слова, либо началу слова, тогда регулярное выражение становится:

 > raw <- "this is Mapof ttMapof qwqqwMapofRt Mapofssdsd it"
> gsub("Mapof\b|\bMapof", "Mapof (Map of)", raw)
[1] "this is Mapof (Map of) ttMapof (Map of) qwqqwMapofRt Mapof (Map of)ssdsd it"
  

Mapof\b означает, что строка должна соответствовать концу слова, \bMapof что она должна соответствовать началу. Оба разделены | значением OR .

Комментарии:

1. Что делать, если строка является необработанной <- «это Mapof ttMapof qwqqwMapofRt Mapofssdsd it» ? Можете ли вы изменить свое решение для этой строки? Вывод должен быть «»это Mapof (Карта) ttMapof (Карта) qwqqwMapofRt Mapof (карта) ssdsd it» Я не очень хорошо знаком с регулярными выражениями. Я пробовал манипулировать им, но безуспешно!

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