【问题标题】:remove (non-breaking) space character in string删除字符串中的(非破坏性)空格字符
【发布时间】:2017-05-02 09:19:41
【问题描述】:

This question 似乎可以轻松删除 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] 中的空格? 感谢您的任何建议!这可能不是空格字符吗?也许答案真的很简单,我忽略了一些东西。

【问题讨论】:

  • 好的,在编织了一个 html 之后,我发现它不是一个空格,而是一个非制动空格。在 html 中看起来像  ,可以使用 \u00A0 进行搜索。棘手!
  • 我已经尝试了你的代码并得到了[1] "11846.4" - 那里没有空格。
  • 奇怪。重新启动 R 并运行代码后,我仍然得到这个空间[1] "11 846.4"。但是我可以用上面提到的\u00A0 删除它。也许不同的软件包版本?
  • 你知道,我刚运行你的代码时它就被删除了。当我开始检查是否可以改进正则表达式时,它停止删除空间。我确认:如您所示创建test,空白消失。如果我使用 test1 <- gsub("[\\sA-Za-z]+", "", area_cult10$V5) 删除所有空格和字母,则空格仍然存在。 gsub("[[:space:]A-Za-z]+", "", area_cult10$V5) 有效。
  • 试试sub(",", ".", gsub("[[:space:]A-Za-z]+|\\W+$", "", area_cult10$V5), fixed=TRUE)

标签: html r regex linux string


【解决方案1】:

您可以将创建 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) - 强制模式识别 Unicode 的 PCRE 动词
  • [\\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) 才能使其工作。为什么它对你有用仍然令人费解..
  • @andrasz:嗯,我有 2 个想法如何以另一种方式解决它,但不知道为什么它在不同情况下会失败。在传递perl=TRUE 参数时,也可以尝试使用"(*UCP)[\\s\\p{L}]+|\\W+$" 模式使用gsub。你在 Linux 上吗?
  • 是的,在基于 Ubuntu 14.04 的 Linux Mint 18 上。这有帮助吗?
  • 是的,您可以枚举所有 Unicode 空白代码点,并使用类似 [ \f\n\r\t\v\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff] 的内容(注意转义序列与 JavaScript 兼容,这取自 MDN 站点),但是当您使用 @ 987654342@ 与 (*UCP) 动词,它将匹配所有 Unicode 空白。下次不用担心了。
猜你喜欢
  • 2017-04-04
  • 1970-01-01
  • 2011-09-21
  • 1970-01-01
  • 2020-10-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多