#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;≈=_-]"))
, поэтому мы получаем все элементы, содержащие по крайней мере один символ, отличный от разрешенного.