2015-12-25 66 views
1

我試圖評估一個正則表達式來確定文件名中的月份並返回月份名稱。我的代碼如下所示:循環重新搜索無法檢測到2月份的月份數並返回正確的月份

DEF月(名):

if re.search('(?<=MLV\s.\s)1', name) or re.search('(?<=MLV\s.\s)+monthName[i]', name): 
    return('January') 
elif re.search('(?<=MLV\s.\s)2', name) or re.search('(?<=MLV\s.\s)+mon[i]', name): 
    return("February") 
    etc... 

文件名是從文件夾中讀入。 文件名的例子:

MLV一個1.4.16.pdf

MLV一個2.7.16.pdf

MLVñ2016年1月

我的代碼能夠順利從確定一個月名顯示所有文件示例,但是我想要刪除所有'elif,並將第一個'if'通過循環並返回適當的月份名稱。 當我通過循環放置'if'時,我似乎無法得到2.7.16(意思是二月份文件名)作爲二月份返回。

這是企圖在一個循環的解決方案:

DEF月(名):

if re.search('(?<=MLV\s.\s)[1-12]', name) or re.search('(?<=MLV\s.\s)+monthName[i]', name): 
     return('January')  # or February etc... 

我也試過:

DEF月(名):

monthName = ['Jan','Feb','Mar','Apr'] 
monthNumber = ['1','2','3','4'] 
for i in range(len(monthName)): 
    for j in monthNumber: 
    if re.search('(?<=MLV\s.\s)+monthNumber[j]', name) or re.search('(?<=MLV\s.\s)+monthName[i]', name): 
      return('January')  # or February etc... 

當然我還需要弄清楚如何在month.Number的re.search中找到'2'時返回'February'。

任何幫助表示讚賞。 乾杯, 馬克

回答

1

我首先試圖獲取對應月份名稱的文件名的一部分,然後匹配它:

months = {'1': 'January', 'Jan': 'January', '2': 'February', 'Feb': 'February', ...} 

matcher = re.search('MLV\s.\s(\w+)', name) 
try: 
    return months[matcher.group(1)] 
except: 
    return None 
+0

優秀!這很有效,我在程序中將同樣的方法應用於Day和Year格式。這壓縮了很多重複的代碼。非常感謝。 – Mark

2

我會嘗試混合approach-這裏calendar.month_name是有規律的字典你可以通過給整數來獲得月份名稱,例如對應於那個月份1January。如果您想要幾個月的簡短形式,請使用calendar.month_abbr而不是會給'Jan'

from dateutil import parser 
import calendar,re 

txt = """MLV A 1.4.16.pdf 

MLV A 2.7.16.pdf 

MLV N Jan 2016""" 

for x,date,y in re.findall(r'(MLV\s*\w\s*)(.*?)($|.pdf)',txt): 
    d=parser.parse(date) 
    print "'{0}' has month {1}".format(date,calendar.month_name[d.month]) 

輸出 -

'1.4.16' has month January 
'2.7.16' has month February 
'Jan 2016' has month January 

re.findall(r'(MLV\s*\w\s*)(.*?)($|.pdf)',txt)將返回[('MLV A ', '1.4.16', '.pdf'), ('MLV A ', '2.7.16', '.pdf'), ('MLV N ', 'Jan 2016', '')]

對於這裏使用正則表達式的詳細信息,請參閱LIVEDEMO

甚至更​​多詳細資料(與去年) - 您可以添加一天過,在這裏,我忽略了,因爲你的數據不會有一天所有 -

from dateutil import parser 
import re 

txt = """MLV A 1.4.16.pdf 

MLV A 2.7.16.pdf 

MLV N Jan 2016""" 

for x,date,y in re.findall(r'(MLV\s*\w\s*)(.*?)($|.pdf)',txt): 
    d=parser.parse(date) 
    print "'{0}' == {1} {2}".format(date,d.strftime("%B"),d.strftime("%Y")) 

輸出 -

'1.4.16' == January 2016 
'2.7.16' == February 2016 
'Jan 2016' == January 2016 

對於strftime細節格式請參閱here