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

R中正则表达式的奇怪行为,r,regex,R,Regex,我有一个简单的web刮板,它的行为似乎很奇怪: -在桌面版RStudio(在Windows上运行R 3.3.3版)中,它的行为与预期一致,并生成一个数值向量 -在RStudio的服务器版本(在Linux上运行R版本3.4.1)中,gsub()(以及随后的数字转换)失败,代码生成一个向量NAs 你知道是什么导致了这种差异吗 library(rvest) url <- "http://benzin.impuls.cz/benzin.aspx?strana=3" impuls <- re

我有一个简单的web刮板,它的行为似乎很奇怪:
-在桌面版RStudio(在Windows上运行R 3.3.3版)中,它的行为与预期一致,并生成一个数值向量
-在RStudio的服务器版本(在Linux上运行R版本3.4.1)中,
gsub()
(以及随后的数字转换)失败,代码生成一个向量
NA
s

你知道是什么导致了这种差异吗

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
库(rvest)

url值中的空格是硬空格,
U+00A0
。运行代码后,我得到了Benzin的输出(复制/粘贴到ideone.com):

然后,我已经确定这些是硬空间,但我仔细检查了一下

当我们遇到困难时,我们应该做的是尝试两种选择

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

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

以下内容的快速在线测试:

Benzin[1]“29.60”

试试
gsub
-1)
gsub([[空格:]*Kč“,”,Benzin)
,2)
gsub((*UCP)\\s*Kč“,”,Benzin,perl=TRUE)
。本地字符(fyi Kč是货币符号,如捷克语中的$)不是问题;空间是。perl版本可以工作(谢谢@WiktorStribiżew!)但是为什么-当常规的
\\s
不能工作时-我被欺骗了…所以,第二个版本可以工作了?@JindraLacko:刚刚检查过,stringr只对我(在Windows上)使用
str_replace__all(Benzin,\\s*K\\u010D,“)
。没有在Linux中尝试过。虽然:(谢谢Wiktor,我真的很感谢你的帮助。现在一切都好了:)除非必要,否则我将避免使用
stringr
(在这种情况下不是这样的;我在原始代码中的其他地方使用了
stru split()
,忘了删除库调用)。我将编辑我的问题,这样以后就不会让任何人感到困惑了。很好,我只是想深入一点。stringr基于,它有自己的Unicode特性。谢谢!我感到困惑,因为这是我在执行R脚本时第一次遇到平台不一致的情况。我对这门语言还是新手。。。
gsub("(*UCP)\\s+Kč","",Benzin, perl=TRUE)
Benzin <- "29.60 Kč"
gsub("(*UCP)\\s+Kč","",Benzin, perl=TRUE)
## => [1] "29.60"