我有几个字符串,并且已经确定了一些日期格式,并希望识别每个字符串上的日期
an_2011_02_12_azar.mp3 ->this is yyyy_mm_dd
20121112_Marcel.mp3 ->this is yyyymmdd
cdani_270607.mp3 ->this is ddmmyy
lica_07_03_15.mp3 ->this is dd_mm_yy
这样做我有:
foo = """
an_2011_02_12_azar.mp3
20121112_Marcel.mp3
cdani_270607.mp3
lica_07_03_15.mp3
"""
try:
lines = foo.split('\n')
except AttributeError:
lines = x
for line in lines:
print(line)
#deals with 2011_02_12 format
match = re.search(r'\d{4}_\d{2}_\d{2}', line)
date = datetime.datetime.strptime(match.group(), '%Y_%m_%d').date()
print(date)
如何应用多个正则表达式以便识别日期?
答案 0 :(得分:1)
如果删除下划线:
datestr = line.replace('_', '')
然后只能处理两种日期格式:yyyymmdd
或ddmmyy
。
此外,每个日期字符串将包含6到8位数字
找到使用正则表达式模式r'\d{8}|\d{6}'
:
datestr = re.search(r'\d{8}|\d{6}', datestr).group()
然后可以使用
解析datestr
date = DT.datetime.strptime(datestr, '%d%m%y')
或
date = DT.datetime.strptime(datestr, '%Y%m%d')
模式r'\d{8}|\d{6}'
还会捕获一些可能非类似日期的字符串,这些数字代表无效日期。我们可以使用try..except
来抓住ValueErrors
来处理这些情况。
import re
import datetime as DT
foo = """\
an_2011_02_12_azar.mp3
20121112_Marcel.mp3
cdani_270607.mp3
lica_07_03_15.mp3
an_2011_13_12_azar.mp3
"""
for line in foo.splitlines():
datestr = line.replace('_', '')
datestr = re.search(r'\d{8}|\d{6}', datestr).group()
try:
# %y matches 2-digit years
date = DT.datetime.strptime(datestr, '%d%m%y')
except ValueError:
try:
# %Y matches 4-digit years
date = DT.datetime.strptime(datestr, '%Y%m%d')
except ValueError:
# handle the error case
date = None
print('{:23} --> {}'.format(line, date))
产量
an_2011_02_12_azar.mp3 --> 2011-02-12 00:00:00
20121112_Marcel.mp3 --> 2012-11-12 00:00:00
cdani_270607.mp3 --> 2007-06-27 00:00:00
lica_07_03_15.mp3 --> 2015-03-07 00:00:00
an_2011_13_12_azar.mp3 --> None