Соответствующие серии амперсандов в R? - PullRequest
0 голосов
/ 23 октября 2018

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

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

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

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' из строки1,У меня может быть два подхода:

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

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

Теперь, в string2, я ожидал аналогичного поведения, где вместо сопоставления пары '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, но он не работает.

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

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

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 голосов
/ 23 октября 2018

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

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

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

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

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

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

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

  • (?<!\\S) - местоположение, которому непосредственно не предшествует непробельный символ (то есть, должно быть начало строки или символ пробела непосредственно слева от текущего местоположения)
  • && - литеральная подстрока
  • (?!\\S) - местоположение, за которым сразу же не следует символ без пробела (то есть, должен быть конец строки или символ пробела немедленносправа от текущего местоположения).
...