Глядя на это, наименее хакерским способом было бы изменить dateutil parser , чтобы иметь параметр нечеткого множественного числа.
parser._parse
берет вашу строку, маркирует ее с помощью _timelex
и затем сравнивает токены с данными, определенными в parserinfo
.
Здесь , если токен ничего не соответствует в parserinfo
, анализ не будет выполнен, если fuzzy
не является True.
То, что я предлагаю, разрешить несоответствия, когда у вас нет обработанных токенов времени, затем, когда вы нажмете несоответствие, обработайте проанализированные данные в этой точке и снова начните искать токены времени.
Не нужно слишком много усилий.
Обновление
Пока вы ждете, когда ваш патч будет добавлен ...
Это немного хакерский, использует непубличные функции в библиотеке, но не требует изменения библиотеки и не является методом проб и ошибок.У вас могут быть ложные срабатывания, если у вас есть какие-нибудь жетоны, которые можно превратить в плавающие.Возможно, вам придется отфильтровать результаты еще немного.
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)
Выход:
Found: 2011 04 23
Parsed: 2011-04-23 00:00:00
Found: 29 July 1928
Parsed: 1928-07-29 00:00:00
Обновление для Дитера
Dateutil 2.1Похоже, что он написан для совместимости с python3 и использует библиотеку «совместимости» под названием six
.Что-то не так с этим, и он не рассматривает str
объекты как текст.
Это решение работает с dateutil 2.1, если вы передаете строки как Unicode или как объекты, похожие на файлы:
from cStringIO import StringIO
for item in timesplit(StringIO(a)):
print "Found:", item
print "Parsed:", p.parse(StringIO(item))
Если вы хотите установить опцию для parserinfo, создайте экземпляр parserinfo и передайте его объекту parser.Например:
from dateutil.parser import _timelex, parser, parserinfo
info = parserinfo(dayfirst=True)
p = parser(info)