从字符串中删除除所选字符以外的所有内容

3
我希望从字符串中删除除数字、负号或小数点以外的所有字符。
我使用了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
@blunders:这似乎是一个非常简单的任务,我希望在正则表达式中已经有所涵盖,所以这是一个学习性问题。但同时,我需要将它提供给另一个人,该人需要在 Excel 工作表上处理带有度数符号的内容(这会强制将单元格格式为文本而非数字)。 - J. Win.
2
Y和A是编码工件,UTF8文本错误地编码为另一个代码页。 - ocodo
今天在r-help上回答了一个类似的问题。请参见http://r.789695.n4.nabble.com/Extract-number-from-string-tp3264340p3264359.html。 - G. Grothendieck
2
r-help上的答案适用于这里,只需在正则表达式中进行适当更改:将"\\D"替换为"[^-.0-9]",将"\\d+"替换为"[-.0-9]+" - G. Grothendieck
3个回答

5
简短明了。感谢G. Grothendieck的评论。
gsub("[^-.0-9]", "", excel_coords)

来自http://stat.ethz.ch/R-manual/R-patched/library/base/html/regex.html的介绍:字符类是由方括号 [ 和 ] 包围的字符列表,它匹配该列表中的任何单个字符;除非列表的第一个字符是插入符 ^,那么它将匹配不在列表中的任何字符。


很好。我尝试过类似的东西,但错误地认为“.”甚至可能需要转义“-”。我想是不需要的。 - IRTFM
1
@DWin:在正则表达式的帮助文件中有相关内容。虽然难以理解,但仍然非常美味。 - Joris Meys
2
艰难?是的。有用?非常有用。美味,嗯,呃,不同的人可能会有不同的看法。我怀疑相关的句子是在字符类内部大多数元字符失去其特殊含义。 - IRTFM

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" 

1
gsub("(.+)([[:digit:]]+\\.[[:digit:]]+)(.+)", "\\2", excel_coords)
[1] "9.53380" "0.02591" "5.91059" "5.8154" 

几乎了解了,但您删掉了我前面的数字和负号。但是现在我明白了。 - J. Win.
gsub("(\\s*)(-?[0-9]+\\.[0-9]+)(.+)", "\\2", excel_coords) - J. Win.
哎呀,我知道我在哪里弄丢了“-”符号,但是我却找不到丢失前导数字的地方。 - IRTFM

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