gpt4 book ai didi

regex - R 如何处理正则表达式中的特殊字符?

转载 作者:行者123 更新时间:2023-12-04 17:35:01 25 4
gpt4 key购买 nike

我对以下 3 个测试的输出感到困惑:

这个包含一个特殊字符 « ° » 并给出了良好的结果:

sub(pattern = ".*([[:digit:]]{5}).*", replacement = "\\1", x = "A°C 01160")
[1] "01160"

这个包括一个报价并给出了好的结果:
sub(pattern = ".*([[:digit:]]{5}).*", replacement = "\\1", x = "01160 'aa")
[1] "01160"

但是这个包含°和引用并返回一个奇怪的结果
sub(pattern = ".*([[:digit:]]{5}).*", replacement = "\\1", x = "A°C 01160 'aa")
[1] "0 'aa"

顺便说一句,如果我提供与 vector 相同的输入,结果会不一样,我也感到困惑:
sub(pattern = ".*([[:digit:]]{5}).*", replacement = "\\1", x = c("A°C 01160", "01160 'aa", "A°C 01160 'aa"))
[1] "01160" "0 'aa" "0 'aa"

有没有人有线索来了解我的问题的根源?

我在 Mac OS 10.8 上使用法语 UTF-8 编码选项运行 R 3.02:
> sessionInfo()
R version 3.0.2 (2013-09-25)
Platform: x86_64-apple-darwin10.8.0 (64-bit)

locale:
[1] fr_FR.UTF-8/fr_FR.UTF-8/fr_FR.UTF-8/C/fr_FR.UTF-8/fr_FR.UTF-8

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

loaded via a namespace (and not attached):
[1] tools_3.0.2

最佳答案

命名字符类的解释,如包括 [:digit:]取决于所讨论的语言环境。它们可以包含非 ASCII 字符。
[[:digit:]]将匹配 Unicode Nd 类别中的任何字符。

如果您只想匹配 ASCII 十进制数字,请使用 [0-9] .

> sub(pattern = ".*([[:digit:]]{5}).*", replacement = "\\1", x = "A°C 01160 'aa")
[1] "0 'aa"
> sub(pattern = ".*([0-9]{5}).*", replacement = "\\1", x = "A°C 01160 'aa")
[1] "01160"
>

此外,您的观察并不是真正针对 R .引自 regex :

Certain named classes of characters are predefined. Their interpretation depends on the locale (see locales); the interpretation below is that of the POSIX locale.



编辑:上面提到的演示:
> Sys.getlocale()
[1] "LC_CTYPE=en_US.UTF-8;LC_NUMERIC=C;LC_TIME=en_US.UTF-8;LC_COLLATE=en_US.UTF-8;LC_MONETARY=en_US.UTF-8;LC_MESSAGES=en_US.UTF-8;LC_PAPER=C;LC_NAME=C;LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=en_US.UTF-8;LC_IDENTIFICATION=C"
> sub(pattern = ".*([[:digit:]]{5}).*", replacement = "\\1", x = "A°C 01160 'aa")
[1] "0 'aa"
> Sys.setlocale("LC_ALL", "C")
[1] "LC_CTYPE=C;LC_NUMERIC=C;LC_TIME=C;LC_COLLATE=C;LC_MONETARY=C;LC_MESSAGES=en_US.UTF-8;LC_PAPER=C;LC_NAME=C;LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=en_US.UTF-8;LC_IDENTIFICATION=C"
> sub(pattern = ".*([[:digit:]]{5}).*", replacement = "\\1", x = "A°C 01160 'aa")
[1] "01160"
>

为了详细说明演示,相同的替换为不同的语言环境返回了不同的结果。切换到 C 时结果如预期语言环境。

关于regex - R 如何处理正则表达式中的特殊字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23610402/

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