循环re.search无法检测2月份的月份数并返回正确的月份

时间:2015-12-25 19:47:17

标签: python regex loops

我试图评估正则表达式以确定文件名中的月份并仅返回月份名称。我的代码如下所示:

def month(姓名):

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 A 1.4.16.pdf

MLV A 2.7.16.pdf

MLV N Jan 2016

我的代码能够成功地确定所显示的所有文件示例中的月份名称,但是我想要消除所有&#39; elif&并且放置第一个&#39; if&#39; 39;通过循环并返回正确的月份名称。 当我把&#39; if&#39;通过一个循环我似乎无法获得2.7.16(意思是二月文件名)作为二月返回。

这是尝试循环解决方案:

def month(姓名):

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

我也尝试过:

def month(姓名):

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...

当然,我还需要弄清楚如何回归二月&#39;当&#39; 2&#39;可以在monthNumber的re.search中找到。

感谢任何帮助。 干杯, 标记

2 个答案:

答案 0 :(得分:2)

我会尝试混合方法 - 这里calendar.month_name是一个常规字典,你可以通过给出对​​应于那个月的整数来获得月份名称,例如1 January。如果您想要短暂的月份,请使用calendar.month_abbr代替calendar.month_name,例如calendar.month_abbr[1]'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

答案 1 :(得分: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