2016-03-04 51 views
0

我一直在擺弄正則表達式匹配,看起來像文件名:正則表達式匹配文件名blahblah_200901.csv(YYYYMM)

blahblah_200901.csv (2009, January) 
blahblah_201512.csv (2015, December) 

我有一個通過了FROM_YEAR,TO_YEAR,FROM_MONTH,TO_MONTH功能所以我可以抓取範圍,但我有一個正確的正則表達式的困難。月份字段由兩位數字(即01至12)指定。

import os, re 
for f in os.listdir("/path/dir"): 
    if re.match(x,f): 
    print (f) 

有在上面的代碼正確的X麻煩。

+0

'R 「blahblah_(19 | 20)\ d {2}(1 [0-2] | 0 [1-9])」'將匹配在20和21世紀的任何一個月(01-12)。 – schwobaseggl

+0

如何控制我的年份和月份輸入變量的正則表達式?我希望能夠匹配所有可能性的子集,其中子集由年份(from,to)和月份(from to)定義。 – codingknob

+0

我明白了。涵蓋日期範圍的正則表達式模式非常複雜。通過解析文件名並比較適當的位,可以更容易和更乾淨地解決涉及的if-else邏輯...... – schwobaseggl

回答

4

最簡單的就是根本不做任何匹配;而是你必須在第一和最後一個文件名,並看到值2之間的配合:

start = 'blahblah_{:04}{:02}'.format(from_year, from_month) 
end = 'blahblah_{:04}{:02}'.format(to_year, to_month) 

for f in os.listdir('/path/dir'): 
    if start <= f <= end: 
     print(f) 

如果前綴不同,或正則表達式比較複雜,你可以使用捕捉組得到的日期部分,然後將它們轉換爲整數:

m = re.match('blahblah(\d{4})(\d{2})', f) 
if m: 
    year = int(m.group(1)) 
    month = int(m.group(2)) 

    if (from_year, from_month) <= (year, month) <= (to_year, to_month): 
     print(f)