Я не могу решить приведенный ниже вопрос. Прошу всех помочь мне в этом отношении.

У меня есть серия амперсандов (&) в моих данных, я хочу заменить пару амперсандов на какое-то значение, но по какой-то причине я не могу это сделать.

Моя попытка и пример:

string1 <- "This aa should be replaced: but this aaa shouldn't"
string2 <- "This && should be replaced: but this &&& shouldn't"

gsub("aa", "XXX", string1)       #1.
gsub("\\baa\\b", "XXX", string1) #2.

gsub("&&", "XXX", string2)       #3.
gsub("\\b&&\\b", "XXX", string2) #4.

Выше, если я хочу сопоставить 'aa' с string1, у меня может быть два подхода:

В подходе 1 (обозначенном как: # 1) я могу просто передать 'aa', но это также будет частично соответствовать 'aaa', чего я не хочу, я хочу, чтобы мое регулярное выражение соответствовало точно парам 'a', которые в мой случай - «аа».

Чтобы решить эту проблему, я использую регулярное выражение (# 2), в этом случае он работает нормально.

Теперь, в строке 2, я ожидал аналогичного поведения, где вместо совпадающей пары «a» я хочу сопоставить пару «&&», которая не соответствует.

Попытка (# 3) работает, но это не тот результат, который я хочу, так как она также частично соответствует '&&&',

Попытка (# 4) не работает по какой-то причине и не заменяет строку.

Мой вопрос:

1) Why pair of ampersands are not working with boundary conditions ?

2) What is the way around to solve this problem ?

Мне действительно пришлось нелегко, и я потратил весь свой день из-за этого и очень плохо себя чувствовал, пытался найти решение в Google, но пока не добился успеха.

В случае, если кто-то знает, если он там, пожалуйста, перенаправьте меня на сообщение. ИЛИ если кто-то найдет его дубликат, дайте мне знать, я удалю его.

Спасибо за вашу помощь и за чтение вопроса.

РЕДАКТИРОВАТЬ : сейчас у меня есть граница слова.

< Сильный > Результаты :

> gsub("aa", "XXX", string1)
[1] "This XXX should be replaced: but this XXXa shouldn't"
> gsub("\\baa\\b", "XXX", string1)
[1] "This XXX should be replaced: but this aaa shouldn't"
> 
> gsub("&&", "XXX", string2)
[1] "This XXX should be replaced: but this XXX& shouldn't"
> gsub("\\b&&\\b", "XXX", string2)
[1] "This && should be replaced: but this &&& shouldn't"
> 

Примечание : я также проверил с perl = TRUE, но он не работает.

1
PKumar 23 Окт 2018 в 15:30

2 ответа

Лучший ответ

\b граница слова означает:

Существуют три различных положения, которые можно квалифицировать как границы слова:

  • Перед первым символом в строке, если первый символ - словесный символ.
  • После последнего символа в строке, если последний символ - это словесный символ.
  • Между двумя символами в строке, где один является символом слова, а другой не является символом слова.

Шаблон "\\b&&\\b" соответствует &&, если он заключен в символы слова , буквы, цифры или _ символы.

Чтобы соответствовать границам пробелов , вы можете использовать

gsub("(?<!\\S)&&(?!\\S)", "XXX", string2, perl=TRUE)

Шаблон соответствует

  • (?<!\\S) - место, которому непосредственно не предшествует непробельный символ (то есть должно быть начало строки или пробельный символ сразу слева от текущего места)
  • && - буквальная подстрока
  • (?!\\S) - позиция, за которой сразу не следует непробельный символ (то есть должен быть конец строки или пробельный символ сразу справа от текущего местоположения).
4
Wiktor Stribiżew 23 Окт 2018 в 12:39

Более конкретно, но вы можете использовать двухэтапную функцию, например

replace2steps <- function(mystring, toreplace,replacement, toexclude, intermediate) {
  intermstring <- gsub(toexclude,  intermediate,string2)
  result <-  gsub(toreplace,  replacement, intermstring)
  result <-  gsub(intermediate,  toexclude, result)
  return(result)
}
replace2steps(string2, "&&", "XX", "&&&", "%%%")
[1] "This XX should be replaced: but this &&& shouldn't"
0
gpier 23 Окт 2018 в 12:48
52949148