R - grep () соответствует, но str_remove_all () завершается ошибкой с не-ascii символами - PullRequest
0 голосов
/ 01 ноября 2018

Я анализирую таблицу из PDF и пытаюсь почистить мои показания. Я пытаюсь сделать простые str_remove_all() некоторые распространенные сбои в моем OCR. Я создал регулярное выражение, которое соответствует моим строкам, однако, когда я помещаю регулярное выражение в str_remove_all(), оно терпит неудачу. Смотрите код ниже:

> regexpattern <- '^(\\s*[[:punct:]]*\\s*)+|^\\s*\\d{1,2}\\s*$|^\\s+$|(^\\s* 
[[:ascii:]]{1}\\s*$)|(^\\s*[^[:ascii:]]{1}\\s*$)'

>   strg <- "Ú"

>  grep(regexpattern,strg, perl = T)
[1] 1

>  str_remove_all(strg,regexpattern)
[1] "Ú"

Есть идеи, почему мой str_remove_all() не работает? Спасибо!

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

РЕДАКТИРОВАТЬ: Удален предыдущий ответ, который, хотя технически работали не проблема.

Проблема в том, что ваше регулярное выражение не делает то, что, я думаю, вы намереваетесь сделать. Первая альтернатива в вашем регулярном выражении - \\s*[[:punct]]*\\s*. Ни один из этих элементов не должен присутствовать, это означает, что все будет совпадать, и ни одна из ваших альтернатив не будет проверена. Поэтому, когда stringr::str_remove_all использует это регулярное выражение, оно будет проходить через альтернативы для этого первого символа, использовать первую альтернативу, так как она совпадает, и игнорировать движение персонажа. Измените его на \\s*[[:punct]]+\\s*, и вы добьетесь большего успеха.

> regexpattern <- '^(\\s*[[:punct:]]*\\s*)+'
> grep(regexpattern,strg, perl = T, value=TRUE)
[1] "Ú"
> regexpattern <- '^(\\s*[[:punct:]]+\\s*)+'
> grep(regexpattern,strg, perl = T, value=TRUE)
character(0)
> regexpattern <- '^(\\s*[[:punct:]]+\\s*)+|^\\s*\\d{1,2}\\s*$|^\\s+$|(^\\s*[[:ascii:]]{1}\\s*$)|(^\\s*[^[[:ascii:]]]{1}\\s*$)'
> str_remove_all(strg, regexpattern)
[1] ""
0 голосов
/ 01 ноября 2018

Ваше регулярное выражение не удаляет все символы, не входящие в ASCII.

grep('^(\\s*[[:punct:]]*\\s*)+|^\\s*\\d{1,2}\\s*$|^\\s+$|(^\\s* 
     [[:ascii:]]{1}\\s*$)|(^\\s*[^[:ascii:]]{1}\\s*$)',
     c("Úa", "Ú", "b"), perl = TRUE, value=TRUE)
[1] "Úa" "Ú"  "b" 

Попробуйте "[^u0000-u007F]+":

grep("[^u0000-u007F]+", c("Úa", "Ú", "b"), perl = TRUE, value=TRUE)
[1] "Úa" "Ú" 

Тогда также str_remove_all() работает как положено:

library(stringr)
str_remove_all(c("Úa", "Ú", "b"), "[^u0000-u007F]+")
[1] "a" ""  "b"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...