2012-01-30 45 views
0

我有一個字符串包含日期字符串,'363898,Catullus,84-11-1 BC' 我怎樣才能用0084替換84年使用Python re?如何在沒有前導零的情況下替換多年,前導零使用Python嗎?

+0

什麼樣的「日期」是'363898,Catullus,84-11-1 BC'?它遵循什麼格式? – 2012-01-30 11:14:13

+5

在我們投入努力解決您的問題之前,請告訴我們您已投入了多少努力。你有什麼嘗試?你讀過什麼文件?你讀過[Python re module documentation](http://docs.python.org/library/re.html)嗎? – 2012-01-30 11:14:47

+0

好吧,如果它只有兩個數字後跟一個逗號(即84或76)與'\\,\ d \ d'匹配,但逗號並未被轉義,我試圖匹配一年。我似乎錯過了一件非常微不足道的事情。 – Sravan 2012-01-30 11:19:34

回答

3

嘗試:

import re 
re.sub(r',(\d\d)-', r',00\1-', '363898, Catullus,84-11-1 BC') 

隨着r',(\d\d)-'我們捕捉到任何對數字(不低於或更多)是一個逗號和破折號之間。我們用一個逗號,兩個零,無論在第一對括號(這裏是兩位數)和一個破折號之間取代整個匹配。

這意味着:

  • 如果有昏迷和破折號之間沒有兩個數字,沒有替代而成。如果存在這些數字,則返回原始字符串
  • 如果存在這些數字,則會自行替換,由相同的逗號和短劃線替代,但會增加零。

在Python中嘗試正則表達式時,只需要玩一個online regular expression tester完整免責聲明:我編碼這個,所以我很偏向。

但也許正則表達式不適合這項工作。有時很好的使用普通功能也是一樣的:

In [10]: entry = '363898,Catullus,84-11-1 BC'.split(',') 
In [11]: numbers = entry[-1].split('-') 
In [12]: numbers = '-'.join([numbers[0].zfill(4)] + numbers[1:]) 
In [13]: entry = entry = ','.join(entry[:-1] + [numbers]) 
In [14]: entry 
Out[14]: '363898,Catullus,0084-11-1 BC' 
+0

非常感謝你們,對於使用單個數字的年份還需要進行哪些修改,如8-11-1到0008-11-1這樣的四位數字? – Sravan 2012-01-30 12:03:44

+0

使用非正則表達式版本,無需修改。這纔是重點。使用正則表達式版本,您可以輕鬆找到它:(\ d \ d)表示兩位數字。 \ d代表一位數字。在替代模式中,\ 1表示括號內的任何內容,其餘是不變的。在我給你的正則表達式測試中發揮價值,你會找到自己的方式。 – 2012-01-30 12:44:36

+0

@Tim Pietzcker:感謝您的編輯。多年的練習,但我的英語仍然很糟糕。我被一個德國人糾正了--D – 2012-01-30 12:47:53

1
re.sub(r"(?=\b\d{2}-\d+-\d)", "00", '363898,Catullus,84-11-1 BC') 

只會修改年份,如果它們只包含兩位數字。你需要另一個

re.sub(r"(?=\b\d-\d+-\d)", "000", '361234,Caesar,8-12-4 BC') 

也處理一位數年。我會離開三位數的年作爲一個練習:)