R-grep()匹配,但str_remove_all()失败,并带有非ASCII字符

时间:2018-11-01 18:45:40

标签: r regex stringi

我正在从PDF解析表,并尝试清除读数。我正在尝试对我的OCR中的一些常见故障进行简单的str_remove_all()处理。我创建了一个与我的字符串匹配的正则表达式,但是,当我将正则表达式放入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 :(得分:2)

编辑:删除了以前的答案,即技术上不是问题。

问题在于您的正则表达式未按照我认为您打算的去做。正则表达式中的第一个替代方法是\\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] ""

答案 1 :(得分:0)

您的正则表达式不会删除所有非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"