我正在从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()
为何失败的任何想法?谢谢!
答案 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"