加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

R正则表达式中的变音符号匹配

发布时间:2020-12-14 05:49:18 所属栏目:百科 来源:网络整理
导读:我只是在R(在OS X上)感到痛苦. 我有一套德语命名文件.并且有我做这个例子的奇怪行为(第一个’K?se’是从键盘输入的 – 第二个是从ls.files()输出复制的): names - c('K?se','K?se')grepl('K?se',names)# [1] TRUE FALSE 经过大量的脑力冲击,我在控制台中注
我只是在R(在OS X上)感到痛苦.

我有一套德语命名文件.并且有我做这个例子的奇怪行为(第一个’K?se’是从键盘输入的 – 第二个是从ls.files()输出复制的):

names <- c('K?se','K?se')
grepl('K?se',names)

# [1] TRUE FALSE

经过大量的脑力冲击,我在控制台中注意到,变形金刚的显示略有不同.

最后我发现:

iconv(names,'latin1','ascii','bytes')

# [1] "K<c3><a4>se"  "Ka<cc><88>se"

这尤其令人惊讶,因为字母?是代码为132的ASCII字符的一部分.

当我输入(从键盘输入)时我也注意到

system('touch k?se2')

它会自动转换为第二个编码.

所以我的问题是 – 如何配置R我在正则表达式中键入的变音符号将与文件名中使用的变音符号相匹配?

Sys.getlocale的输出:

> Sys.getlocale()
[1] "de_AT.UTF-8/de_AT.UTF-8/de_AT.UTF-8/C/de_AT.UTF-8/de_AT.UTF-8"

更新

困扰我的行为如下:

filename <- 'K?se.Rdata'
save(file=filename)
list.files(pattern=filename)
# character(0)

所以文件名不等于用于创建它的字符串.

嗯 – 这似乎是Mac特有的 – 在我的Windows机器上它按预期工作.

解决方法

“K< c3>< a4> se”将“?”编码为unicode字符U 00E4(LATIN SMALL LETTER A WITH DIAERESIS).

“Ka< cc>< 88> se”将“?”编码为unicode字符U 0061(LATIN SMALL LETTER A)和U 0308(COMBINING DIAERESIS).

两者在技术上都是正确的,但不同.要比较它们,您需要规范化字符串.您可以使用包stringi:

stri_trans_nfc("Kau0308se") -> "Ku00E4se"

更多信息:

> Unicode normalization (form C) in R : convert all characters with accents into their one-unicode-character form?
> Wikipedia: Unicode Equivalence

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读