gpt4 book ai didi

regex - R:需要用正则表达式替换不可见/重音字符

转载 作者:行者123 更新时间:2023-12-01 10:36:38 27 4
gpt4 key购买 nike

我正在处理从具有不同语言环境设置的多台不同机器生成的文件,所以我最终得到了一个数据框的列,其中同一个词有不同的写法:

CÓRDOBA
CÓRDOBA
CÒRDOBA

我想将所有这些转换为 CORDOBA。我试过做

t<-gsub("Ó|Ó|Ã’|°|°|Ò","O",t,ignore.case = T) # t is the vector of names

Wich 会一直工作,直到它找到一些“不可见”的字符: Invisible Characters

如您所见,我无法在 R 中看到 Ã\ 之间的附加字符(如果我复制粘贴到 MS Word,word 用一个空的矩形显示它)。我已经尝试 dput 向量,但它显示的与屏幕上的完全一样(没有“不可见”字符)。

我运行了 Encoding(t),然后 ir 为所有值返回了 unknown

我的系统配置如下:

> sessionInfo()
R version 3.2.1 (2015-06-18)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 8 x64 (build 9200)

locale:
[1] LC_COLLATE=Spanish_Colombia.1252 LC_CTYPE=Spanish_Colombia.1252 LC_MONETARY=Spanish_Colombia.1252 LC_NUMERIC=C
[5] LC_TIME=Spanish_Colombia.1252

attached base packages:
[1] stats graphics grDevices utils datasets methods base

other attached packages:
[1] zoo_1.7-12 dplyr_0.4.2 data.table_1.9.4

loaded via a namespace (and not attached):
[1] R6_2.1.0 assertthat_0.1 magrittr_1.5 plyr_1.8.3 parallel_3.2.1 DBI_0.3.1 tools_3.2.1 reshape2_1.4.1 Rcpp_0.11.6 stringi_0.5-5
[11] grid_3.2.1 stringr_1.0.0 chron_2.3-47 lattice_0.20-31

我已经saveRDS 一个文件,其中包含玩具实际值和预期值的数据框,可能是来自hereloadRDS .我不确定它会加载我遇到的相同问题(取决于你的语言环境),但我希望它会加载,这样你就可以提供一些帮助。

最后,我想将所有这些特殊字符转换为无重音字符(ÓO 等),希望不必手动输入每个一个特殊的正则表达式(换句话说,如果可能的话,我想要某种 gsub("[:weird:]","[:e​​quivalentToWeird:]",t)。如果不可能,至少我希望能够找到(并替换)那些“不可见”字符。

谢谢,

############## 编辑以添加 ###################

如果我运行以下代码:

d<-readRDS("c:/path/to(downloaded/Dropbox/file/inv_char.Rdata")
stri_escape_unicode(d$actual)

这是我得到的:

[1] "\\u00c3\\u201cN  N\\u00c2\\u00b0 08 \\\"CACIQUE CALARC\\u00c3\\u0081\\\" - ARMENIA"
[2] "\\u00d3N N\\u00b0 08 \\\"CACIQUE CALARC\\u00c1\\\" - ARMENIA"
[3] "\\u00d3N N\\u00b0 08 \\\"CACIQUE CALARC\\u00c1\\\" - ARMENIA(ALTERNO)"

正常输出是:

> d$actual
[1] ÓN N° 08 "CACIQUE CALARCÃ" - ARMENIA ÓN N° 08 "CACIQUE CALARCÁ" - ARMENIA ÓN N° 08 "CACIQUE CALARCÁ" - ARMENIA(ALTERNO)

最佳答案

在@hadley 的帮助下,他将我指向 stringi,我最终发现了违规字符并替换了它们。这是我最初的尝试:

unweird<-function(t){
t<-stri_escape_unicode(t)
t<-gsub("\\\\u00c3\\\\u0081|\\\\u00c1","A",t)
t<-gsub("\\\\u00c3\\\\u02c6|\\\\u00c3\\\\u2030|\\\\u00c9|\\\\u00c8","E",t)
t<-gsub("\\\\u00c3\\\\u0152|\\\\u00c3\\\\u008d|\\\\u00cd|\\\\u00cc","I",t)
t<-gsub("\\\\u00c3\\\\u2019|\\\\u00c3\\\\u201c|\\\\u00c2\\\\u00b0|\\\\u00d3|\\\\u00b0|\\\\u00d2|\\\\u00ba|\\\\u00c2\\\\u00ba","O",t)
t<-gsub("\\\\u00c3\\\\u2018|\\\\u00d1","N",t)
t<-gsub("\\u00a0|\\u00c2\\u00a0","",t)
t<-gsub("\\\\u00f3","o",t)
t<-stri_unescape_unicode(t)
}

产生了预期的结果。我对其他 stringi 函数有点好奇,所以我想知道它的替代函数是否可以在我的 330 万行上更快。然后我像这样尝试了 stri_replace_all_regex:

stri_unweird<-function(t){
stri_unescape_unicode(stri_replace_all_regex(stri_escape_unicode(t),
c("\\\\u00c3\\\\u0081|\\\\u00c1",
"\\\\u00c3\\\\u02c6|\\\\u00c3\\\\u2030|\\\\u00c9|\\\\u00c8",
"\\\\u00c3\\\\u0152|\\\\u00c3\\\\u008d|\\\\u00cd|\\\\u00cc",
"\\\\u00c3\\\\u2019|\\\\u00c3\\\\u201c|\\\\u00c2\\\\u00b0|\\\\u00d3|\\\\u00b0|\\\\u00d2|\\\\u00ba|\\\\u00c2\\\\u00ba",
"\\\\u00c3\\\\u2018|\\\\u00d1",
"\\u00a0|\\u00c2\\u00a0",
"\\\\u00f3"),
c("A","E","I","O","N","","o"),
vectorize_all = F))
}

作为旁注,我对这两种方法都运行了 microbenchmark,结果如下:

g<-microbenchmark(unweird(t),stri_unweird(t),times = 100L)
summary(g)
min lq mean median uq max neval cld
1 423.0083 425.6400 431.9609 428.1031 432.6295 490.7658 100 b
2 118.5831 119.5057 121.2378 120.3550 121.8602 138.3111 100 a

关于regex - R:需要用正则表达式替换不可见/重音字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32230344/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com