R中正则表达式的奇怪行为

4
我有一个简单的网页爬虫,似乎表现很奇怪:
- 在桌面版的RStudio(在Windows上运行R版本3.3.3)中,它表现如预期,并且产生数字向量。
- 在服务器版的RStudio(在Linux上运行R版本3.4.1)中,gsub()(随后是数字转换)失败,代码产生一组NA
你有任何想法会造成这种差异吗?
library(rvest)

url <- "http://benzin.impuls.cz/benzin.aspx?strana=3"
impuls <- read_html(url, encoding = "windows-1250")

asdf <- impuls %>%
  html_table()

Benzin <- asdf[[1]]$X7

chrBenzin <- gsub("\\sKč","",Benzin)  # something is wrong here...

numBenzin <- as.double(chrBenzin)
numBenzin

尝试使用 gsub 的不同变体 - 1) gsub("[[:space:]]*Kč","",Benzin),2) gsub("(*UCP)\\s*Kč","",Benzin, perl=TRUE) - Wiktor Stribiżew
本地字符(fyi Kč是捷克的货币符号,类似于$)不是问题;空格才是。Perl版本可以工作(感谢@WiktorStribiżew!),但为什么正则表达式中的\\s不能工作,这让我困惑不解... - Jindra Lacko
那么,第二个行了吗? - Wiktor Stribiżew
1个回答

3

值中的空格是硬空格,U+00A0。运行代码后,我在 Benzin 的输出结果为(复制/粘贴在 ideone.com 上):

enter image description here

那时,我已经确定那些是硬空格,但我还是在这里进行了再次确认。

当我们遇到硬空格时,应该尝试两种替代方案。

一种是在基本R函数中使用[[:space:]]的TRE(默认正则表达式引擎)。 另一种是使用带有(*UCP)动词的PCRE正则表达式,以让正则表达式引擎知道我们正在处理Unicode。

在您的情况下,在Linux上,似乎PCRE起作用,因此您应该坚持使用PCRE版本(比TRE更一致):

gsub("(*UCP)\\s+Kč","",Benzin, perl=TRUE)

一个关于Linux R的快速在线测试:

Benzin <- "29.60 Kč"
gsub("(*UCP)\\s+Kč","",Benzin, perl=TRUE)
## => [1] "29.60"

@JindraLacko:刚刚检查了一下,stringr 只有在 Windows 上使用 str_replace_all(Benzin, "\\s*K\\u010D", "") 才能正常工作。我还没有在 Linux 上尝试过。但是无法使用字面量 č。 :( - Wiktor Stribiżew
感谢Wiktor,非常感谢你的帮助。现在一切都好了 :) 除非必要,我会避免使用stringr(在这种情况下不需要;我在原始代码的其他地方使用了str_split(),忘记删除库调用)。我将编辑我的问题,以便将来不会让任何人感到困惑。 - Jindra Lacko
好的,我只是想深入了解一下这个问题。stringr 基于 ICU 正则表达式库,并且它有自己的 Unicode 特点。 - Wiktor Stribiżew
谢谢!我感到困惑,因为这是我第一次遇到在执行R脚本时平台不一致的情况。我对这种语言还很陌生... - Jindra Lacko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接