«Неверное регулярное выражение, причина, ошибка обратной косой черты в конце с gsub в R

Я получаю сообщение об ошибке при замене текста в R.

 x
 [1] "Easy bruising and bleeding.\\"

gsub(as.character(x), "\\", "")
Error in gsub(as.character(x), "\\", "") : 
   invalid regular expression 'Easy bruising and bleeding.\', reason 'Trailing backslash'

person Manish    schedule 31.03.2014    source источник


Ответы (2)


Аргументы в неправильном порядке. Исследование help("gsub").

gsub( "\\", "", "Easy bruising and bleeding.\\", fixed=TRUE)
#[1] "Easy bruising and bleeding."
person Roland    schedule 31.03.2014
comment
Как вы делаете это без fixed = TRUE, например, сопоставляя \ как часть более крупного регулярного выражения? - person Josh; 10.12.2018
comment
Обычно я добавляю обратную косую черту до тех пор, пока не будет достаточно побегов. - person Roland; 10.12.2018
comment
Ха! Это определенно работает. В конце концов я понял, что вам нужно 4 \ в первом аргументе gsub, чтобы соответствовать 1 литералу \ в строке (третий аргумент). Я опубликую то, что я узнал в качестве ответа. - person Josh; 11.12.2018

tl;dr: Вам нужно 4 \s (т. е. \\\\) в первом аргументе gsub, чтобы найти один литерал \ в третьем аргументе gsub. Общий процесс таков:

  • gsub получает \\\\, передает \\
  • регулярное выражение получает \\, ищет \.

Чтобы избежать fixed = TRUE, что исключает выполнение более сложных поисков, ваш код должен быть:

> gsub( "\\\\", "", "Easy bruising and bleeding.\\")
[1] "Easy bruising and bleeding."

Объяснение. Причина, по которой вам нужно 4 \, заключается в том, что \ является специальным символом для механизма регулярных выражений, поэтому для того, чтобы механизм регулярных выражений нашел литерал \, ему необходимо передать \\; первый \ указывает, что второй \ — это не специальный символ, а \, который должен соответствовать буквально. Таким образом, регулярное выражение получает \\ и ищет \ в строке.

\ также является специальным символом для R, поэтому для того, чтобы gsub передал \\ механизму регулярных выражений, gsub необходимо получить \\\\. Первый \ указывает, что второй \ является литералом \, а не специальным символом; третий \ делает то же самое для четвертого \. Таким образом, gsub получает \\\\ и передает \\ механизму регулярных выражений.

Опять же, общий процесс таков: gsub получает \\\\, передает \\; регулярное выражение получает \\, ищет \.

Примечание. хотя строка, которую вы нам дали, выводится на экран как "Easy bruising and bleeding.\\", на самом деле это строка Easy bruising and bleeding.\. Первый \ на самом деле просто побег для второго \. Вы можете проверить это с помощью этого кода:

> cat("Easy bruising and bleeding.\\")
Easy bruising and bleeding.\

Вот почему код, который я предлагаю, имеет 4 \s, а не 8 \s.

person Josh    schedule 11.12.2018