4

このコードを使用して、Python の文字列から複数の日付を解析しようとしています。

from dateutil.parser import _timelex, parser
a = "Approve my leave from first half of 12/10/2012 to second half of 20/10/2012 "
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)

コードは文字列の後半を2番目の日付として取得しており、このエラーが発生しています。

raise ValueError, "unknown string format"

ValueError: unknown string format

「後半」を「後半」または「前半」に変更すると、すべて正常に動作します。

この文字列を解析するのを手伝ってくれる人はいますか?

4

2 に答える 2

3

"second"パーサーは、検出されたを処理できませんでした。パラメーターを にtimesplit設定した場合、パーサーは壊れませんが、意味のあるものも生成しません。fuzzyTrue

from cStringIO import StringIO
for item in timesplit(StringIO(a)):
    print "Found:", item
    print "Parsed:", p.parse(StringIO(item),fuzzy=True)

アウト:

Found: 12 10 2012
Parsed: 2012-12-10 00:00:00
Found: second
Parsed: 2013-01-11 00:00:00
Found: 20 10 2012
Parsed: 2012-10-20 00:00:00

タイムスプリットを修正するか、エラーを処理する必要があります。

オプション 1:

info.hmsを失うtimetoken

オプション 2:

from cStringIO import StringIO
for item in timesplit(StringIO(a)):
    print "Found:", item
    try:
        print "Parsed:", p.parse(StringIO(item))
    except ValueError:
        print 'Not Parsed!'

アウト:

Found: 12 10 2012
Parsed: 2012-12-10 00:00:00
Found: second
Not Parsed!
Parsed: Found: 20 10 2012
Parsed: 2012-10-20 00:00:00
于 2013-01-11T13:36:29.857 に答える
2

日付のみが必要な場合は、正規表現を使用して抽出し、日付を処理できます。

a = "Approve my leave from first half of 12/10/2012 to second half of 20/10/2012 "

import re
pattern = re.compile('\d{2}/\d{2}/\d{4}')
pattern.findall(a)
['12/10/2012', '20/10/2012']
于 2013-01-11T13:43:31.527 に答える