0

Je suis ce jour l'analyse d'un document PDF qui a une autre date comme les formatsErreur lors de l'analyse syntaxique date à laquelle l'entrée a des valeurs numériques non la date

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 

Mon entrée est

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

et si je supprimer "291/16, 300/16, 581/16 & 1143/16" de la chaîne, le code fonctionne parfaitement.

Quelqu'un peut-il m'aider avec la date d'analyse tout en ignorant les valeurs ci-dessus.

+0

Quel devrait être le résultat de l'instruction 'print'? –

+0

Pour me répondre personnellement, entrez le symbole 'at' pour obtenir un menu de destinataires, choisissez mon nom, puis entrez votre réponse. –

Répondre

1

Il se peut que la bibliothèque soit confuse car elle voit plusieurs composants de type date dans la chaîne. Si vous connaissez vos dates ressembleront May 31, 2017 et que les faux positifs ressemblerez 581/16, vous pouvez appliquer une expression régulière à la chaîne pour le nettoyer avant de faire l'analyse syntaxique floue:

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) 

Si au contraire vous souhaitez définir la structure des dates que vous l'analyse syntaxique pour, vous pouvez utiliser des expressions régulières d'une manière différente:

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 

vous pouvez même combiner les deux pour extraire toutes les dates qui apparaît dans une ligne donnée pour vos modèles attendus:

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

Merci danielcorin ... Cela a certainement aidé ... cependant, un autre défi est que mon document a beaucoup d'autres nombres aussi du format suivant: 234/23/134 ou 234. maintenant filer ces deux formats pourrait également filtrer la date du format 23/12/2017 ... Donc, y a-t-il un moyen de définir à quoi ressemblerait ma date plutôt que de filtrer les données non-datées? – Akhil

+0

Oui, vous pouvez, avec regex aussi. Voir les modifications ci-dessus –

+0

C'est absolument ce qui se passe. – Paul

0

Utilisez une déclaration try avec une clause except, par exemple:

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

Puisque vous savez ce format de date fonctionne avec cet analyseur, vous pouvez utiliser le code basé sur une expression régulière pour convertir un autre format de date à ce format et également pour supprimer les éléments qui confondent l'analyseur.

Dans cet exemple explicatif, j'ai ajouté la date '23/12/2017 'près du début de la chaîne avec laquelle vous travailliez. Ce code surveille les modèles indiqués dans re.sub et transmet les chaînes correspondantes à process. process supprime tous ceux qui se composent de moins de trois parties. Ensuite, il tente de créer une date à partir des trois nombres du match qui a été passé. Si cela réussit, il formate cette date comme indiqué dans la sortie afin que l'analyseur puisse la reconnaître. J'ai utilisé la bibliothèque de flèches en conjonction avec datetime pour ces manipulations de date.

>>> 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 '