[Python] re e output non previsto risolto!

Alessandro Dentella sandro a e-den.it
Lun 17 Giu 2013 09:40:05 CEST


On Sun, Jun 16, 2013 at 11:21:13PM +0200, Adriano Barbieri wrote:
> 
> 
> No Marco,
> Ci sono campi vuoti e con valori tutt'altro che formato data, cognome, nome,
> comune_nascita, provincia_nascita, telefono1, telefono2, data_assunzione,
> scadenza_contratto, bla bla bla...
>  
> Grazie Marco, tranquillo, l'errore è dovuto a quei due apici dopo l'operatore
> 'or' (barra verticale) che prevede appunto una data|niente data o niente se il
> match è False


credo che tu abbia risolto il problema senza comprendere le regexp, né il
suggerimento di Marco.

Forse ti aiuta aprire l'interprete interattivo e provare a giocare con le
regexp. Secondo me stai facendo confusione fra l'oggetto match, quello che
viene rappresentato da una stringa del tipo "<_sre.SRE_Match object at
0x05096860>" con il gruppo 0: m.group(0) che è la parte che viene
"matchata".



In [1]: import re

In [2]: m=re.search('\d\d/\d\d/\d\d\d\d', '02/06/2008')

In [3]: m
Out[3]: <_sre.SRE_Match at 0xa1ba608>

Questo è il modo in cui python ti rappresenta l'oggetto match, l'oggetto che
ha il metodo group che usi quando esegui m.group(0)


In [4]: m.group(0)
Out[4]: '02/06/2008'

In [5]: m1=re.search('\d\d/\d\d/\d\d\d\d', '02/06/20')

In [6]: m1

m1 è None, in quanto il pattern non corrisponde.


In [7]: m1.group(0)
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-7-884727d1fc08> in <module>()
----> 1 m1.group(0)

AttributeError: 'NoneType' object has no attribute 'group'

Ed ecco l'errore AttributeError che ti dice marco.
Se ora prendi una strnga lunga che contiene il match oltre ad altre cose
vedi che il match resta sempre e solo la data


In [8]: re.search('\d\d/\d\d/\d\d\d\d', 'un di era il 02/06/2008')
Out[8]: <_sre.SRE_Match at 0xa21eb48>

In [9]: _.group(0)
Out[9]: '02/06/2008'

NOTA: '_' per ipytho è l'ultimo valore restituito



il tuo approccio era "ma è sempre funzioanto", quando Marco cercava di farti
ragionare sul fatto che m.group(0) non ha alcun significato in quel contesto
e se non serve lo togli. m.group(0) restituisce il match ma non lo assegni a
nulla quindi non te ne fai nulla!!!

A te 'eseercizio di aggiungere la '|' per vedere cosa cambia.

sandro
*:-)





Maggiori informazioni sulla lista Python