【问题标题】:Remove from a string all except selected characters从字符串中删除除选定字符之外的所有字符
【发布时间】:2011-06-23 03:29:23
【问题描述】:

我想从字符串中删除所有不是数字、减号或小数点的字符。

我使用read.xls 从 Excel 导入数据,其中包含一些奇怪的字符。我需要将这些转换为数字。我对正则表达式不太熟悉,因此需要一种更简单的方法来执行以下操作:

excel_coords <- c(" 19.53380ݰ", " 20.02591°", "-155.91059°", "-155.8154°")
unwanted <- unique(unlist(strsplit(gsub("[0-9]|\\.|-", "", excel_coords), "")))
clean_coords <- gsub(do.call("paste", args = c(as.list(unwanted), sep="|")), 
                     replacement = "", x = excel_coords)

> clean_coords
[1] "19.53380"   "20.02591"   "-155.91059" "-155.8154" 

如果有人能告诉我为什么这些字符会出现在我的某些数据中(度数符号是原始 Excel 工作表的一部分,但其他不是),那就太好了。

【问题讨论】:

  • 为什么你不能在加载数据之前做一个简单的查找和替换?如果数据在 excel 中,请尝试强制数据为小数。此外,您似乎已经找到了一个同样有效的解决方案。
  • @blunders:这似乎是一个如此简单的任务,我希望它已经存在于正则表达式中,所以这是一个学习问题。而且,我把它提供给需要它在带有度数符号的 Excel 工作表上工作的人(这会强制单元格为文本而不是数字)。
  • Y 和 A 作为编码伪影存在,UTF8 文本未正确编码到另一个代码页。
  • 今天在 r-help 上回答了一个类似的问题。见r.789695.n4.nabble.com/…
  • r-help 上的答案适用于此处,并适当更改正则表达式:"[^-.0-9]" 而不是 "\\D""[-.0-9]+" 而不是 "\\d+"

标签: regex r gdata


【解决方案1】:

短而甜。感谢 G. Grothendieck 的评论。

gsub("[^-.0-9]", "", excel_coords)

来自http://stat.ethz.ch/R-manual/R-patched/library/base/html/regex.html:“字符类是包含在 [ 和 ] 之间的字符列表,它匹配该列表中的任何单个字符;除非列表的第一个字符是插入符号 ^,当它匹配任何不在名单。”

【讨论】:

  • 这很甜蜜。我尝试了类似的东西,但错误地认为“。”甚至可能需要转义“-”。我猜不是。
  • @DWin :它在正则表达式的帮助文件中。很难吃的三明治,但还是很好吃。
  • 强硬?是的。有用?极其。好吃,呃,嗯,懂事的人可能会有所不同。我怀疑相关的句子如下:“大多数元字符在字符类中失去了它们的特殊含义。”
【解决方案2】:

也可以通过使用strsplitsapplypaste 并通过索引正确的字符而不是错误的字符来完成:

 excel_coords <- c(" 19.53380ݰ", " 20.02591°", "-155.91059°", "-155.8154°")
 correct_chars <- c(0:9,"-",".")
 sapply(strsplit(excel_coords,""), 
          function(x)paste(x[x%in%correct_chars],collapse=""))

[1] "19.53380"   "20.02591"   "-155.91059" "-155.8154" 

【讨论】:

    【解决方案3】:
    gsub("(.+)([[:digit:]]+\\.[[:digit:]]+)(.+)", "\\2", excel_coords)
    [1] "9.53380" "0.02591" "5.91059" "5.8154" 
    

    【讨论】:

    • 几乎,但你已经砍掉了我的前导数字和减号。但我现在明白了。
    • gsub("(\\s*)(-?[0-9]+\\.[0-9]+)(.+)", "\\2", excel_coords)
    • 哎呀。我可以看到丢失“-”的位置,但看不到丢失前导数字的位置。
    猜你喜欢
    • 2014-11-08
    • 1970-01-01
    • 2015-11-24
    • 1970-01-01
    • 2011-04-25
    • 1970-01-01
    • 2017-09-01
    • 1970-01-01
    • 2017-04-05
    相关资源
    最近更新 更多