2013-01-07 51 views
1

我的數據看起來像這樣,其中負數是數字末尾的後綴 。R中的正則表達式幫助

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

有人能幫我找到一個正則表達式來產生下面所需的輸出。

"general_amount" 
441244 
-127769 
43819 
-522600 
+0

完全喪失,並已足以與它搏鬥 –

+0

的是」 根eral_amount「文本部分的數據還是隻是你的標題?爲什麼使用正則表達式?如果您的數據是正數或帶有 - 後綴的數字,則還有其他檢測負值的方法。 – Spacedman

回答

9
sub('^0*([^-]*)(-?)$', '\\2\\1', x) 

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

^0*比賽都領先0字符。
[^-]*匹配所有非-個字符。
-?匹配零或一個-字符。
最後,$匹配字符串的末尾。

中間兩片與()捕獲,如\\1\\2,並以相反的順序打印。

+1

我很好奇..你能解釋一下這裏發生了什麼嗎? :) –

+0

這很簡單,但我會將其添加到答案。 –

+0

感謝馬修,如果你可以添加這裏發生的事情,那將會很棒。 –

0

多德我花了3個小時找到問題答案

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

但最終我做到了。可能有一些短暫的未來,但我明白了

+0

這對'sed'解決方案來說沒問題,但是需要'R'中的解決方案。它很重要;在'R'中,'''字符串以字符串值的形式顯示在控制檯上,而不是值本身的一部分,因此你不需要在末尾輸入'(「)'(爲什麼捕獲?)。開頭的'[^ a-zA-Z0-9]'可以簡單地稱爲'^'。 –

+0

感謝哥們,我也在學習。那謝謝啦。其實我是這樣做的,因爲我想允許雙引號'''0 – user2134226

+0

我確定你發現這個問題是因爲'regex'標籤,但現在可能是安裝'R'並且玩的時候了。如果你喜歡數據,它就是一個很好的操場。 –

1

使用gsub,與另一種想法。

的想法是將輸入劃分成3個元素

一系列0
  1. :(^ 0 +)
  2. 系列編號的:([0-9] +)
  3. 找到' - ' 1或零時間:( - ) 「

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

這指定必須有一個前導0。 –