在字符串中删除(不间断)空格字符

5

这个问题似乎很容易在R中删除字符串中的空格字符。然而,当我加载以下表格时,我无法删除两个数字之间的空格(例如。11 846.4):

require(XML)
require(RCurl)
require(data.table)

link2fetch = 'https://www.destatis.de/DE/Themen/Branchen-Unternehmen/Landwirtschaft-Forstwirtschaft-Fischerei/Feldfruechte-Gruenland/Tabellen/ackerland-hauptnutzungsarten-kulturarten.html'

theurl = getURL(link2fetch, .opts = list(ssl.verifypeer = FALSE) ) # important!
area_cult10 = readHTMLTable(theurl, stringsAsFactors = FALSE)
area_cult10 = rbindlist(area_cult10)
    
test = sub(',', '.', area_cult10$V5) # change , to . 
test = gsub('(.+)\\s([A-Z]{1})*', '\\1', test) # remove LETTERS
gsub('\\s', '', test[1]) # remove white space?

为什么我不能去除test[1]中的空格? 感谢任何建议!这可能是除了空格字符以外的其他东西吗?也许答案很简单,我正在忽略某些事情。

1
好的,在编写HTML后,我发现它不是一个空格,而是一个不换行的空格。在HTML中它看起来像这样 ,可以用\u00A0进行搜索。有些棘手! - andschar
我已经尝试了你的代码并得到了[1] "11846.4" - 没有空格。 - Wiktor Stribiżew
在重新启动 R 并运行代码后,仍然会出现这个空格 [1] "11 846.4"。不过,我可以使用上述的 \u00A0 删除它。或许是因为包版本不同? - andschar
1
你知道吗,当我运行你的代码时,它被删除了。当我开始检查是否可以改进正则表达式时,它停止删除空格了。我确认:按照你展示的方式创建“test”,空格会消失。如果我使用test1 <- gsub("[\\sA-Za-z]+", "", area_cult10$V5)来删除所有的空格和字母,那么空格就会保留下来。而且gsub("[[:space:]A-Za-z]+", "", area_cult10$V5)是有效的。 - Wiktor Stribiżew
尝试使用 sub(",", ".", gsub("[[:space:]A-Za-z]+|\\W+$", "", area_cult10$V5), fixed=TRUE) - Wiktor Stribiżew
1个回答

6

您可以将test的创建缩短为只有2个步骤,并且只使用1个PCRE正则表达式(注意perl=TRUE参数):

test = sub(",", ".", gsub("(*UCP)[\\s\\p{L}]+|\\W+$", "", area_cult10$V5, perl=TRUE), fixed=TRUE)

结果:

 [1] "11846.4" "6529.2"  "3282.7"  "616.0"   "1621.8"  "125.7"   "14.2"   
 [8] "401.6"   "455.5"   "11.7"    "160.4"   "79.1"    "37.6"    "29.6"   
[15] ""        "13.9"    "554.1"   "236.7"   "312.8"   "4.6"     "136.9"  
[22] "1374.4"  "1332.3"  "1281.8"  "3.7"     "5.0"     "18.4"    "23.4"   
[29] "42.0"    "2746.2"  "106.6"   "2100.4"  "267.8"   "258.4"   "13.1"   
[36] "23.5"    "11.6"    "310.2"  
gsub正则表达式值得特别关注:
  • (*UCP) - PCRE动词,强制模式是Unicode感知的
  • [\\s\\p{L}]+ - 匹配1个或多个空格或字母字符
  • | - 或(备选操作符)
  • \\W+$ - 以1个或多个非单词字符结尾的字符串。
然后,sub(",", ".", x, fixed=TRUE)将用文字字符串替换第一个,.fixed=TRUE可以提高性能,因为它不必编译正则表达式。

感谢详细的解释!然而,即使使用 [[:space:]],我仍无法摆脱不间断空格。我必须使用 test = sub(",", ".", gsub("\u00A0|[[:space:][:alpha:]]+|\\W+$", "", area_cult10$V5), fixed=TRUE) 才能让它工作。仍然很困惑为什么您可以用它。 - andschar
@andrasz:嗯,我有两个想法可以用另一种方式解决它,但不知道为什么在不同情况下会失败。同时尝试使用“(*UCP)[\s\p{L}]+|\W+$”模式,并传递perl=TRUE参数来使用gsub。你在Linux上吗? - Wiktor Stribiżew
是的,在基于Ubuntu 14.04的Linux Mint 18上。这有帮助吗? - andschar
是的 - 请查看[x <- c("11 846.4 A", "6 529.2 A", "3 282.7 A") gsub("(*UCP)\s+", "", x, perl=TRUE)`](https://ideone.com/EyJ9r6)。 - Wiktor Stribiżew
1
是的,您可以枚举所有Unicode空格代码点,并使用类似[ \f\n\r\t\v\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]的东西(请注意,转义序列与JavaScript兼容,这是从MDN网站中获取的),但是当您使用\s(*UCP)动词一起使用时,它将匹配所有Unicode空格。下次不用担心了。 - Wiktor Stribiżew
显示剩余2条评论

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