Comment puis-je extraire la date d'une chaîne comme "singe 2010-07-10 love banana"? Merci!
Si la date est donnée sous une forme fixe, vous pouvez simplement utiliser une expression régulière pour extraire la date et "datetime.datetime.strptime" pour analyser la date:
match = re.search(r'\d{4}-\d{2}-\d{2}', text)
date = datetime.strptime(match.group(), '%Y-%m-%d').date()
Sinon, si la date est donnée sous une forme arbitraire, vous ne pouvez pas l'extraire facilement.
En utilisant python-dateutil :
In [1]: import dateutil.parser as dparser
In [18]: dparser.parse("monkey 2010-07-10 love banana",fuzzy=True)
Out[18]: datetime.datetime(2010, 7, 10, 0, 0)
Les dates non valides génèrent un ValueError
:
In [19]: dparser.parse("monkey 2010-07-32 love banana",fuzzy=True)
# ValueError: day is out of range for month
Il peut reconnaître des dates dans de nombreux formats:
In [20]: dparser.parse("monkey 20/01/1980 love banana",fuzzy=True)
Out[20]: datetime.datetime(1980, 1, 20, 0, 0)
Notez qu'il fait une supposition si la date est ambiguë:
In [23]: dparser.parse("monkey 10/01/1980 love banana",fuzzy=True)
Out[23]: datetime.datetime(1980, 10, 1, 0, 0)
Mais la façon dont il analyse les dates ambiguës est personnalisable:
In [21]: dparser.parse("monkey 10/01/1980 love banana",fuzzy=True, dayfirst=True)
Out[21]: datetime.datetime(1980, 1, 10, 0, 0)
Pour extraire la date d'une chaîne en Python; le meilleur module disponible est le module datefinder .
Vous pouvez l'utiliser dans votre projet Python en suivant les étapes simples indiquées ci-dessous.
pip install datefinder
import datefinder
input_string = "monkey 2010-07-10 love banana"
# a generator will be returned by the datefinder module. I'm typecasting it to a list. Please read the note of caution provided at the bottom.
matches = list(datefinder.find_dates(input_string))
if len(matches) > 0:
# date returned will be a datetime.datetime object. here we are only using the first match.
date = matches[0]
print date
else:
print 'No dates found'
remarque: si vous attendez un grand nombre de correspondances; puis le transtypage vers la liste ne sera pas une méthode recommandée car il y aura une surcharge de performances importante.
À l'aide de Pygrok, vous pouvez définir des extensions abstraites de la syntaxe des expressions régulières.
Les motifs personnalisés peuvent être inclus dans votre expression régulière au format %{PATTERN_NAME}
.
Vous pouvez également créer une étiquette pour ce modèle, en les séparant par deux points: %s{PATTERN_NAME:matched_string}
. Si le modèle correspond, la valeur sera retournée dans le cadre du dictionnaire résultant (par exemple result.get('matched_string')
)
Par exemple:
from pygrok import Grok
input_string = 'monkey 2010-07-10 love banana'
date_pattern = '%{YEAR:year}-%{MONTHNUM:month}-%{MONTHDAY:day}'
grok = Grok(date_pattern)
print(grok.match(input_string))
La valeur résultante sera un dictionnaire:
{'month': '07', 'day': '10', 'year': '2010'}
Si le motif de date n'existe pas dans la chaîne d'entrée, la valeur de retour sera None
. En revanche, si votre modèle n'a pas d'étiquette, il renverra un dictionnaire vide {}
Les références: