2009-05-26 65 views
2

我有一個CSV文件有幾個條目,每個條目有2個unix時間戳格式化日期。Python中的正則表達式替換

我有一個名爲convert()的方法,它接收時間戳並將其轉換爲YYYYMMDD

現在,由於每行有兩個時間戳,我將如何用新值替換每個時間戳?

編輯:只是爲了澄清,我想將每個出現的時間戳轉換爲YYYYMMDD格式。這是什麼在擾亂我,因爲re.findall()返回一個列表。

回答

1

修改我認爲通過「unix時間戳格式化日期」是指從時代開始數秒。這假定文件中的每個數字都是UNIX時間戳。如果不是這種情況就需要調整正則表達式:

import re, sys 

# your convert function goes here 

regex = re.compile(r'(\d+)') 
for line in sys.stdin: 
    sys.stdout.write(regex.sub(lambda m: 
    convert(int(m.group(1))), line)) 

這從標準輸入讀取和電話轉換上找到每個號碼。

這裏的「訣竅」是re.sub可以接受一個從匹配對象轉換爲字符串的函數。我假設你的convert函數需要一個int並返回一個字符串,所以我用lambda作爲一個適配器函數來抓取匹配的第一組,並將其轉換爲int,然後將結果int傳遞給它。

+0

謝謝!我還在開始python,這有很大幫助。 – aaront 2009-05-26 03:25:01

+0

我得到一個「沒有這樣的組」的錯誤。 – aaront 2009-05-26 03:34:33

+0

嗯......你輸入這個錯誤的輸入行是什麼樣的? (您可能希望在調試時在sys.stdout.write行之後添加一個'sys.stdout.flush()'調用。) – 2009-05-26 03:56:19

3

如果你知道更換:

p = re.compile(r',\d{8},') 
p.sub(','+someval+',', csvstring) 

如果它是一個格式變化:

p = re.compile(r',(\d{4})(\d\d)(\d\d),') 
p.sub(r',\3-\2-\1,', csvstring) 

編輯:對不起,只是意識到你說的蟒蛇,上述

+0

我的python有點粗略,希望我說得對。 – 2009-05-26 03:02:29

+1

他說Unix時間戳,應該是類似1243326265(當前時間)。他希望將YYYYMMDD格式作爲輸出。 – tzot 2009-05-26 08:26:19

0

我會沿着這些線使用一些東西。很像勞倫斯的迴應,但是您需要轉換時間戳,並將文件名作爲參數。此代碼假定您正在使用最近的日期(在9/9/2001之後)。如果您需要更早的日期,請降低10到9或更低。

import re, sys, time 

regex = re.compile(r'(\d{10,})') 

def convert(unixtime): 
    return time.strftime("%Y%m%d", time.gmtime(unixtime)) 

for line in open(sys.argv[1]): 
    sys.stdout.write(regex.sub(lambda m: convert(int(m.group(0))), line)) 

編輯:清理了代碼。

採樣輸入

foo,1234567890,bar,1243310263 
cat,1243310263,pants,1234567890 
baz,987654321,raz,1 

輸出

foo,20090213,bar,20090526 
cat,20090526,pants,20090213 
baz,987654321,raz,1 # not converted (too short to be a recent)