Alex mentionné pyparsing et voici donc une approche pyparsing à votre même problème:
from pyparsing import Word, Suppress, Regex, oneOf, SkipTo
import datetime
DASHES = Word('-').suppress()
LPAR,RPAR,AT = map(Suppress,"()@")
date = Regex(r'\d{2}/\d{2}/\d{4}')
time = Regex(r'\d{2}:\d{2}:\d{2}')
status = oneOf("Busy Available Idle Offline Unavailable")
statechange1 = 'changed status from' + status('fromstate') + 'to' + status('tostate')
statechange2 = 'became' + status('tostate')
linefmt = (DASHES + SkipTo('(')('name') + LPAR + SkipTo(RPAR)('email') + RPAR +
(statechange1 | statechange2) +
AT + date('date') + time('time') + DASHES)
def convertFields(tokens):
if 'fromstate' not in tokens:
tokens['fromstate'] = 'NULL'
tokens['name'] = tokens.name.strip()
tokens['email'] = tokens.email.strip()
d,mon,yr = map(int, tokens.date.split('/'))
h,m,s = map(int, tokens.time.split(':'))
tokens['datetime'] = datetime.datetime(yr, mon, d, h, m, s)
linefmt.setParseAction(convertFields)
for line in text.splitlines():
fields = linefmt.parseString(line)
print "%(name)s/%(email)s %(fromstate)-10.10s %(tostate)-10.10s %(datetime)s" % fields
impressions:
Mark Grey/[email protected] Busy Available 2010-07-14 16:32:36
Silvia Pablo/[email protected] NULL Available 2010-07-14 16:32:39
pyparsing vous permet de joindre des noms aux résultats des champs (comme le nom les groupes dans la réponse de style de Tom Pietzcker), plus les actions d'analyse pour agir ou manipuler les actions analysées - notez la conversion des champs date et heure séparés en un vrai objet datetime, déjà converti et prêt pour le traitement après analyse sans muss supplémentaire ou d'agitation.
Voici une boucle modifiée qui vient dumps les jetons analysés et les champs nommés pour chaque ligne:
for line in text.splitlines():
fields = linefmt.parseString(line)
print fields.dump()
imprime:
['Mark Grey ', '[email protected]', 'changed status from', 'Busy', 'to', 'Available', '14/07/2010', '16:32:36']
- date: 14/07/2010
- datetime: 2010-07-14 16:32:36
- email: [email protected]
- fromstate: Busy
- name: Mark Grey
- time: 16:32:36
- tostate: Available
['Silvia Pablo ', '[email protected]', 'became', 'Available', '14/07/2010', '16:32:39']
- date: 14/07/2010
- datetime: 2010-07-14 16:32:39
- email: [email protected]
- fromstate: NULL
- name: Silvia Pablo
- time: 16:32:39
- tostate: Available
Je soupçonne que vous continuez à travailler sur ce problème, vous trouverez d'autres variations sur le format du texte de saisie en précisant comment l'état de l'utilisateur a changé. Dans ce cas, vous devez simplement ajouter une autre définition comme statechange1
ou statechange2
et l'insérer dans linefmt
avec les autres. Je pense que la structuration de la définition de l'analyseur par pyparsing aide les développeurs à revenir à un analyseur après que les choses ont changé, et à étendre facilement leur programme d'analyse.
NaN ........... –
Eh bien, ce n'est pas un nombre correct :) –
EDIT NOTE: Marcelo et Tim vous a donné une assez bonne réponse pour ce que vous voulez faire. Voici la documentation de la bibliothèque d'expressions régulières, incluse dans Python, qui peut vous aider à étendre le code: http://docs.python.org/library/re.html –