我试图评估正则表达式以确定文件名中的月份并仅返回月份名称。我的代码如下所示:
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中找到。
感谢任何帮助。 干杯, 标记
答案 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