【问题标题】:regular expression help in RR中的正则表达式帮助
【发布时间】:2013-01-07 00:28:16
【问题描述】:

我的数据看起来像这样,其中负号是后缀 在数字的末尾。

"general_amount"
"0000000441244"
"0000000127769-"
"0000000043819"
"0000000522600-"

谁能帮我找到一个正则表达式来产生下面的所需输出。

"general_amount"
 441244
-127769
 43819
-522600

【问题讨论】:

  • 彻底迷路了,受够了摔跤
  • “general_amount”文本是数据的一部分还是只是您的标题?为什么要使用正则表达式?如果您的数据是正数或带有 - 后缀的数字,则还有其他方法可以检测负数。

标签: regex r


【解决方案1】:
sub('^0*([^-]*)(-?)$', '\\2\\1', x)

## [1] "general_amount" "441244"         "-127769"        "43819"          "-522600"

^0* 匹配所有前导0 字符。
[^-]* 匹配所有非- 字符。
-? 匹配零个或一个- 字符。
最后,$ 匹配字符串的结尾。

中间两块用()捕获,分别为\\1\\2,并以相反的顺序打印。

【讨论】:

  • 我很好奇..你能解释一下这里发生了什么吗? :)
  • 这很简单,但我会把它添加到答案中。
  • 感谢 Matthew,如果您能在此处添加内容,那就太好了。
  • 感谢 Matthew 回答问题和解释
【解决方案2】:

使用 gsub ,换个思路。

想法是将输入分成3个元素

  1. 0系列:(^0+)
  2. 数列:([0-9]+)
  3. 找到 '-' 1 次或 0 次:(-?)"

       as.numeric(gsub("(^0+)([0-9]+)(-?)","\\3\\2",tt))
       [1]  441244 -127769   43819 -522600
    

【讨论】:

  • 这指定必须有一个前导0。
【解决方案3】:

老兄,我花了 3 个小时才找到你问题的答案

sed -re 's/[^a-zA-Z0-9]0+([0-9]+)(-?)/\2\1/g' anyfile.txt 

但最后我做到了。可能有一些缺点,但我几乎明白了

【讨论】:

  • sed 解决方案可以,但需要R 解决方案。这很重要;在R 中," 字符围绕字符串值打印到控制台,而不是值本身的一部分。因此,您不希望最后出现(")(为什么要捕获?)。而开头的[^a-zA-Z0-9] 可以简单地为^
  • 谢谢哥们,我也在学习。那谢谢啦。实际上我这样做是因为我想在 0 之前允许双引号 "
  • 我敢肯定,由于regex 标签,您发现了这个问题,但也许现在是安装R 并使用它的时候了。如果您喜欢数据,这简直就是游乐场。
猜你喜欢
  • 2011-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多