0

を持っているとき、私は他の日のような形式を持っているPDF文書エラー入力が非日付数値

Traceback (most recent call last): 
    File "/Users/akjain/Documents/workspace/Parse13F/13FParser.py", line 26, in <module> 
    print dparser.parse(' Crl. A. Nos. 291/16, 300/16, 581/16 & 1143/16 Judgment reserved on : May 31, 2017 ', fuzzy=True) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/parser.py", line 697, in parse 
    return DEFAULTPARSER.parse(timestr, **kwargs) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/dateutil/parser.py", line 303, in parse 
    raise ValueError, "unknown string format" 
ValueError: unknown string format 

から日付を解析していた日付を解析している間に私の入力は

print dparser.parse(' Crl. A. Nos. 291/16, 300/16, 581/16 & 1143/16 Judgment reserved on : May 31, 2017 ', fuzzy=True) 

と私の場合です文字列から "291/16、300/16、581/16 & 1143/16"を削除すると、コードは完全に実行されます。

誰でも上記の値を無視して日付を解析するのに役立つことができます。

+0

'print'文の結果はどうなるべきですか? –

+0

私に返信するには、「at」記号を個人的に入力して受信者のメニューを表示し、自分の名前を選択してから、あなたの回答を入力してください。 –

答えて

1

文字列に日付のような複数のコンポーネントがあるため、ライブラリが混乱している可能性があります。あなたが定義する代わりに、場合

import re 

string = ' Crl. A. Nos. 291/16, 300/16, 581/16 & 1143/16 Judgment reserved on : May 31, 2017 ' 
string = re.sub('[\d]+/[\d]+', '', s) 
print dparser.parse(string, fuzzy=True) 

:あなたはあなたの日付をMay 31, 2017ようになり、偽陽性が581/16次のようになりますことが分かっている場合は、ファジーの解析を行う前に、それをクリーンアップするために文字列に正規表現を適用することができます

import re 

s = 'test 234/23/134 234 291/16, 300/16, 581/16 & 1143/16 May 31, 2017 10/15/1997' 
match_1 = re.search(r'[A-Za-z]+ [\d]{1,2}, [\d]{4}', s) 
print match_1.group(0) 
# => May 31, 2017 
match_2 = re.search(r'[\d]{2}/[\d]{2}/[\d]{4}', s) 
print match_2.group(0) 
# => 10/15/1997 

は、あなたも、あなたの予想されるパターンのための特定の行に表示すべての日付を抽出するために2つを組み合わせることができます:あなたが解析している日付の構造は、あなたが別の方法で正規表現を使用することができます。

import re 

pattern_1 = r'[A-Za-z]+ [\d]{1,2}, [\d]{4}' 
pattern_2 = r'[\d]{2}/[\d]{2}/[\d]{4}' 
matches = re.findall(r'{}|{}'.format(pattern_1, pattern_2), s) 
print matches 
# => ['May 31, 2017', '10/15/1997'] 
+0

ありがとうdanielcorin ...これは確かに助けになりました...しかし、もう一つの課題は、私の文書に234/23/134または234という形式の他の多くの数字があることです。この2つの形式をファイリングすると、フォーマットの23/12/2017 ...だから、日付以外のデータをフィルタリングするのではなく、自分の日付がどのように見えるかを定義できる方法はありますか? – Akhil

+0

はい、正規表現でも可能です。上記の編集を参照してください –

+0

これは絶対に起こっていることです。 – Paul

0

は、例えば、except句でtryステートメントを使用します。あなたはその形式に他の日付形式を変換するために、正規表現に基づいてコードを使用することができるパーサでどのような作品を日付形式を知っているので

try: 
    print dparser.parse('...') 
except ValueError as ve: 
    print('ValueError: {}'.format(ve)) 
0

とパーサーを混乱させるアイテムを削除することもできます。

この説明例では、作業していた文字列の先頭近くに'23/12/2017 'という日付を追加しました。このコードは、re.subに示されているパターンを監視し、一致する文字列をprocessに渡します。 processは、3つ未満の部分で構成されるすべてを削除します。次に、合致した3つの数字から日付を作成しようとします。これが成功した場合、パーサーがそれを認識できるように出力に示されているようにこの日付をフォーマットします。私はこれらの日付操作のためにdatetimeと一緒に矢印ライブラリを使用しました。

>>> import re 
>>> s = 'On 23/12/2017 Crl. A. Nos. 291/16, 300/16, 581/16 & 1143/16 Judgment reserved on : May 31, 2017 ' 
>>> from datetime import datetime 
>>> import arrow 
>>> def process(matchobj): 
...  items = matchobj.group(0).split('/')[::-1] 
...  items = [int(_) for _ in items] 
...  if len(items)<3: 
...   return '' 
...  try: 
...   the_date = arrow.get(datetime(*items)) 
...   return the_date.format('MMMM DD, YYYY') 
...  except: 
...   return matchobj.group(0) 
... 
>>> re.sub(r'(?:\d+/)+\d+', process, s) 
'On December 23, 2017 Crl. A. Nos. , , & Judgment reserved on : May 31, 2017 ' 
関連する問題