Python dateutil解析器,忽略字符串的非日期部分

der*_*jer 6 python python-2.7 python-dateutil

我使用dateutil来解析图片文件名并根据日期对它们进行排序.由于并非我的所有图片都有元数据,因此dateutil试图猜测它们的放置位置.

我的大多数照片都采用以下格式:2007-09-10_0001.jpg 2007-09-10_0002.jpg等...

fileName = os.path.splitext(file)[0]
print("Guesssing date from ", fileName)
try:
    dateString = dateParser.parse(file, fuzzy=True)
    print("Guessed date", dateString)
    year=dateString.year
    month = dateString.month
    day=dateString.day
except ValueError:
    print("Unable to determine date of ", file)
Run Code Online (Sandbox Code Playgroud)

我得到的回报是这样的:

('Guesssing date from ', '2007-09-10_00005')
('Unable to determine date of ', '2007-09-10_00005.jpg')
Run Code Online (Sandbox Code Playgroud)

现在我应该能够从下划线之后删除所有内容,但如果可能的话,我想要一个更强大的解决方案,以防我有其他格式的图片.我虽然模糊会尝试在字符串中找到任何日期并与之匹配,但显然不起作用......

是否有一种简单的方法可以让解析器找到任何看起来像日期的东西并在此之后停止?如果没有,强制解析器忽略下划线后的所有内容的最简单方法是什么?或者使用忽略部分定义多个日期格式的方法.

谢谢!

Gui*_*ume 4

只要无法解码,您就可以尝试“减少”字符串:

from dateutil import parser

def reduce_string(string):
    i = len(string) - 1
    while string[i] >= '0' and string[i] < '9':
        i -= 1
    while string[i] < '0' or string[i] > '9':
        i -= 1
    return string[:i + 1]

def find_date(string):
    while string:
        try:
            dateString = parser.parse(string, fuzzy=True)
            year = dateString.year
            month = dateString.month
            day = dateString.day
            return (year, month, day)
        except ValueError:
            pass

        string = reduce_string(string)

    return None

date = find_date('2007-09-10_00005')
if date:
    print date
else:
    print "can't decode"
Run Code Online (Sandbox Code Playgroud)

这个想法是删除字符串的末尾(任何数字,然后任何非数字),直到解析器可以将其解码为有效日期。