それを見ると、最もハッキリしない方法は、dateutilパーサーを変更してファジー倍数オプションを持たせることです。
parser._parse
文字列を受け取り、それをトークン化し_timelex
、トークンを で定義されたデータと比較しparserinfo
ます。
ここで、トークンが のいずれにも一致しない場合、が True でparserinfo
ない限り、解析は失敗します。fuzzy
処理された時間トークンがない間は不一致を許可することをお勧めします。不一致が発生した場合は、その時点で解析されたデータを処理し、時間トークンの検索を再度開始します。
力を入れすぎてはいけません。
アップデート
パッチが適用されるのを待っている間...
これは少しハックで、ライブラリで非パブリック関数を使用しますが、ライブラリを変更する必要はなく、試行錯誤ではありません。float に変換できる単独のトークンがある場合、誤検知が発生する可能性があります。結果をさらにフィルタリングする必要がある場合があります。
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 00:00: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 をインスタンス化し、それを parser オブジェクトに渡します。例えば:
from dateutil.parser import _timelex, parser, parserinfo
info = parserinfo(dayfirst=True)
p = parser(info)