循环搜索无法检测到二月号并返回正确的月份

2024-09-28 22:21:26 发布

您现在位置:Python中文网/ 问答频道 /正文

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

定义月份(名称):

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 2016年1月

我的代码能够成功地从显示的所有文件示例中确定月份名称,但是我希望消除所有的'elif',并将第一个'if'放入循环中,并返回正确的月份名称。 当我通过一个循环输入if时,我似乎无法将2.7.16(意味着二月的文件名)返回为二月

下面是循环解决方案的尝试:

定义月份(名称):

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

我也试过:

定义月份(名称):

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

当然,我还需要弄清楚如何在重新搜索monthNumber时返回'二月'

感谢您的帮助。 干杯, 标记


Tags: ornamere名称searchreturnif定义
2条回答

我将首先尝试获取文件名中与月份名称对应的部分,然后匹配它:

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

我会尝试一种混合的方法-这里的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

相关问题 更多 >