看着它,最少哈克的方式将修改dateutil解析器有一个模糊的多个选项。
parser._parse
需要你的字符串,它标记化_timelex
,然后在定义的数据令牌进行比较parserinfo
。
在这里,如果令牌不匹配任何东西parserinfo
,解析将失败,除非fuzzy
是真实的。
我建议您在没有任何已处理的时间标记的情况下允许不匹配,然后当您遇到不匹配的情况时,在那一点处理已解析的数据,然后再次开始寻找时间标记。
应该不会耗费太多精力。
当你在等待你的补丁得到滚入…
这是一个小哈克,在图书馆使用非公共职能,但并不需要修改库,而不是尝试和错误。你可能有误报,如果你有一个可以变成浮动,任何单个令牌。您可能需要进一步过滤结果。
from dateutil.parser import _timelex, parser
a = "I like peas on 2011-04-23, and I also like them on easter and my birthday, the 29th of July, 1928"
p = parser()
info = p.info
def timetoken(token):
try:
float(token)
return True
except ValueError:
pass
return any(f(token) for f in (info.jump,info.weekday,info.month,info.hms,info.ampm,info.pertain,info.utczone,info.tzoffset))
def timesplit(input_string):
batch = []
for token in _timelex(input_string):
if timetoken(token):
if info.jump(token):
continue
batch.append(token)
else:
if batch:
yield " ".join(batch)
batch = []
if batch:
yield " ".join(batch)
for item in timesplit(a):
print "Found:", item
print "Parsed:", p.parse(item)
产量:
找到:2011年04月23日
解析:2011-04-23 0时〇〇分00秒
发现:1928年7月29日
解析:1928-07-29 00:00:00
Dateutil 2.1出现,为兼容python3编写,并使用“兼容”库调用six
。什么是不正确使用它,它不是治疗str
的对象为文本。
如果您将字符串作为unicode或类似文件的对象传递,则此解决方案可与dateutil 2.1一起使用:
from cStringIO import StringIO
for item in timesplit(StringIO(a)):
print "Found:", item
print "Parsed:", p.parse(StringIO(item))
如果你想在parserinfo设置选项,实例化一个parserinfo并把它传递给解析器对象。例如:
from dateutil.parser import _timelex, parser, parserinfo
info = parserinfo(dayfirst=True)
p = parser(info)