2010-10-15 20 views
0

我試圖格式的文件名,isodate.txtPython正則表達式匹配的文件date.txt

>>> DATE_NAME_PATTERN = re.compile("((.*)(-[0-9]{8})?)\\.txt") 
>>> DATE_NAME_PATTERN.match("myfile-20101019.txt").groups() 
('myfile-20101019', 'myfile-20101019', None) 

不過,我需要獲得單獨組文件名和-isodate部分匹配文件名。

任何建議和/或者說明將不勝感激

回答

1

你需要:DATE_NAME_PATTERN = re.compile("((.*?)(-[0-9]{8})?)\\.txt")

*執行gready比賽因此從未使用過的第二部分。在我的意見中,你不應該使用普通的字符串操作就足夠了的普通表達式(簡單的split()將會這樣做)。

+0

謝謝,改變。*爲非貪婪。*?這是有效的。應該已經發現了! – 2010-10-15 09:54:06

1

取出最外面的組,並把各組之間的-

>>> DATE_NAME_PATTERN = re.compile(r'(.*)-([0-9]{8})?\.txt') 
>>> DATE_NAME_PATTERN.match("myfile-20101019.txt").groups() 
('myfile', '20101019') 
2

如果你知道文件名格式都不會改變,你不需要re

filename = 'myfile-20101019.txt' 
basename, extension = filename.rsplit('.', 1) 
firstpart, date = basename.rsplit('-', 1) 


In : firstpart, date, extension 
Out: ('myfile', '20101019', 'txt') 

或只是不擴展名:

firstpart, date = filename.rsplit('.', 1)[0].rsplit('-', 1) 
# ['myfile', '20101019'] 

適用於更復雜的filenam上課太:

filename = 'more.complicated-filename-20101004.txt' 
firstpart, date = filename.rsplit('.', 1)[0].rsplit('-', 1) 
# ['more.complicated-filename', '20101004'] 

或者,只是爲了更漂亮分裂擴展:

import os 

filename = 'more.complicated-filename-20101004.txt' 
firstpart, date = os.path.splitext(filename)[0].rsplit('-', 1) 
# ['more.complicated-filename', '20101004'] 
+0

在我們的情況下,使用重新適合我們的情況,因爲我們使用大量正則表達式來匹配不同的文件名格式。不管怎麼說,還是要謝謝你 – 2010-10-15 10:05:14

0

不要使用正則表達式是:

import os 

basename, extension= os.path.splitext(filename) 
namepart, _, isodate= basename.rpartition('-') 

我建議rpartition,因爲isodate(在你的問題中定義)將不包含 包含破折號。