【问题标题】:remove comma from a digits portion string从数字部分字符串中删除逗号
【发布时间】:2012-08-25 23:52:04
【问题描述】:

如何(最快最好)从字符串的数字部分删除逗号而不影响字符串中的其余逗号。因此,在下面的示例中,我想从数字部分中删除逗号,但 dog 后面的逗号应该保留(是的,我知道 1023455 中的逗号是错误的,但只是扔了一个角盒)。

我有什么:

x <- "I want to see 102,345,5 dogs, but not too soo; it's 3,242 minutes away"

期望的结果:

[1] "I want to see 1023455 dogs, but not too soo; it's 3242 minutes away"

规定:必须在基础包中完成,不得添加。

提前谢谢你。

编辑: 谢谢 Dason、Greg 和 Dirk。你的两个回答都很好。我正在玩一些接近 Dason 的反应的东西,但括号内有逗号。现在再看也觉得没有道理。我对这两种响应进行了微基准测试,因为我需要速度(文本数据):

Unit: microseconds
         expr     min      lq  median      uq     max
1  Dason_0to9  14.461  15.395  15.861  16.328  25.191
2 Dason_digit  21.926  23.791  24.258  24.725  65.777
3        Dirk 127.354 128.287 128.754 129.686 154.410
4      Greg_1  18.193  19.126  19.127  19.594  27.990
5      Greg_2 125.021 125.954 126.421 127.353 185.666

+1 给你们所有人。

【问题讨论】:

  • What have you tried? 提示:R 有能力进行正则表达式替换。
  • @GSee 我确实使用了我提供的确切示例。稍后,我将发布整个代码。正如您在 Dirks 的回答中提到的那样,我会将 perl = TRUE 放入其中,但我不认为在 Dason 中使用它。

标签: regex r


【解决方案1】:

您可以用数字本身替换带有模式(逗号后跟数字)的任何内容。

x <- "I want to see 102,345,5 dogs, but not too soo; it's 3,242 minutes away"
gsub(",([[:digit:]])", "\\1", x)
#[1] "I want to see 1023455 dogs, but not too soo; it's 3242 minutes away"
#or
gsub(",([0-9])", "\\1", x)
#[1] "I want to see 1023455 dogs, but not too soo; it's 3242 minutes away"

【讨论】:

  • 在数字之间使用逗号可能会更加小心。
  • 是的。起初我考虑过这一点,但在我的解决方案中变得懒惰。我的解决方案应该可以工作,但你说得对,检查逗号两边的数字是最安全的。
  • 感谢 Dason,速度最快且易于理解。我自己也很接近这种方法。 +1
【解决方案2】:

使用 Perl 正则表达式,并专注于“数字逗号数字”,然后我们只用数字替换:

R> x <- "I want to see 102,345,5 dogs, but not too soo; it's 3,242 minutes away"
R> gsub("(\\d),(\\d)", "\\1\\2", x, perl=TRUE)
[1] "I want to see 1023455 dogs, but not too soo; it's 3242 minutes away"
R> 

【讨论】:

  • 我认为不需要perl=TRUE
  • 很高兴知道这是 Tyler 的要求之一 :)
  • 感谢 Dirk,非常易于使用。不久前,我在这里看到了与正则表达式名称类似的东西 (LINK) 并经常使用它,但没有想到将其应用于数字。 +1
【解决方案3】:

这里有几个选项:

> tmp <- "I want to see 102,345,5 dogs, but not too soo; it's 3,242 minutes away"
> gsub('([0-9]),([0-9])','\\1\\2', tmp )
[1] "I want to see 1023455 dogs, but not too soo; it's 3242 minutes away"
> gsub('(?<=\\d),(?=\\d)','',tmp, perl=TRUE)
[1] "I want to see 1023455 dogs, but not too soo; it's 3242 minutes away"
> 

它们都匹配一个数字,后跟一个逗号,后跟一个数字。 [0-9]\d(额外的 \ 转义第二个,以便它通过常规 epression)都匹配一个数字。

第一个 epression 捕获逗号之前的数字和逗号之后的数字,并在替换字符串中使用它们。基本上把它们拉出来再放回去(但不把逗号放回去)。

第二个版本使用零长度匹配,(?&lt;=\\d) 表示逗号前必须有一个数字才能匹配,但数字本身不是匹配的一部分。 (?=\\d) 表示逗号后面需要有一个数字才能匹配,但它不包含在匹配中。所以基本上它匹配一个逗号,但只有在前面和后面都有一个数字。由于只匹配逗号,所以替换字符串为空表示删除逗号。

【讨论】:

  • 你的第一个答案对我来说非常透明,你介意在你的解决方案中扩展一下正则表达式的情况吗?
猜你喜欢
  • 1970-01-01
  • 2012-03-09
  • 1970-01-01
  • 2019-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-24
  • 1970-01-01
相关资源
最近更新 更多