Извлеките запрещенные символы

#r #regex

#r #регулярное выражение

Вопрос:

У меня есть транскрипции с ошибочными кодировками, то есть символы, которые встречаются, но не должны встречаться.

В этих игрушечных данных разрешены только символы этого класса:

 "[)(/][A-Za-z0-9↑↓£¥°!.,:¿?~lt;gt;≈=_-]"  df lt;- data.frame(  Utterance = c("~°maybe you (.) gt;should ¥just¥lt;",  "SOME text |lt;-- pipe¿ and€", # lt;--: | and €  "blah%", # lt;--: %  "text ^more text", # lt;--: ^  "£norm(hh)a::l£mal, (1.22)"))  

Что мне нужно сделать, так это:

  • обнаружение Utterance s, содержащих любые неправильные кодировки
  • извлеките неправильные символы

С обнаружением у меня все в порядке, но извлечение с треском проваливается:

 library(stringr) library(dplyr) df %gt;%  filter(!str_detect(Utterance, "[)(/][A-Za-z0-9↑↓£¥°!.,:¿?~lt;gt;≈=_-]")) %gt;%  mutate(WrongChar = str_extract_all(Utterance, "[^)(/][A-Za-z0-9↑↓£¥°!.,:¿?~lt;gt;≈=_-]"))  Utterance WrongChar 1 SOME text |lt;-- pipe¿ and€ SO, ME, t, ex, |lt;, --, p, ip, e¿, a, nd 2 blah% bl, ah 3 text ^more text te, xt, ^m, or, t, ex  

Как можно улучшить извлечение, чтобы получить этот ожидаемый результат:

 Utterance WrongChar 1 SOME text |lt;-- pipe¿ and€ |, € 2 blah% % 3 text ^more text ^  

Ответ №1:

Вам нужно

  • Убедитесь [ , что и ] экранируются внутри класса символов
  • Добавьте шаблон пробелов в обе проверки регулярных выражений, так как его отсутствие портит ваши результаты.

Поэтому вам нужно использовать

 df %gt;%  filter(str_detect(Utterance, "[^\s)(/\]\[A-Za-z0-9↑↓£¥°!.,:¿?~lt;gt;≈=_-]")) %gt;%  mutate(WrongChar = str_extract_all(Utterance, "[^\s)(/\]\[A-Za-z0-9↑↓£¥°!.,:¿?~lt;gt;≈=_-]"))  

Выход:

 Utterance WrongChar 1 SOME text |lt;-- pipe¿ and€ |, € 2 blah% % 3 text ^more text ^  

Обратите внимание , что я использовал положительную логику filter(str_detect(Utterance, "[^\s)(/\]\[A-Za-z0-9↑↓£¥°!.,:¿?~lt;gt;≈=_-]")) , поэтому мы получаем все элементы, содержащие по крайней мере один символ, отличный от разрешенного.