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

时间:2017-08-27 21:27:43

标签: r regex

我有一个简单的网络刮刀似乎表现得很奇怪:
- 在桌面版本的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

1 个答案:

答案 0 :(得分:3)

值中的空格是一个硬空间 .customDropdown .dropdown-menu>li>a { display: block; padding: 1px 5px; clear: both; font-weight: 400; line-height: 1.42857143; color: #333; white-space: nowrap; } 。运行代码后,我得到U+00A0的输出(在ideone.com上复制/粘贴):

enter image description here

然后,我已经确定那些是硬空间,但我加倍检查here

当我们有足够的空间时,我们该怎么办才能尝试两种选择。

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

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

(*UCP)

Linux R上的快速在线测试:

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