Python attualmente non ha un equivalente di scanf(). . Le espressioni regolari sono generalmente più potenti, sebbene più prolisse, rispetto alle stringhe di formattazione della scanf(). La tabella seguente offre alcune tracce più o meno equivalenti tra i token della stringa di formattazione della scanf() e le espressioni regolari.
scanf() Token | Espressioni regolari |
---|---|
%c |
. |
%5c |
.{5} |
%d |
[-+]?\d+ |
%e , %E , %f , %g |
[-+]?(\d+(\.\d*)?|\d*\.\d+)([eE][-+]?\d+)? |
%i |
[-+]?(0[xX][\dA-Fa-f]+|0[0-7]*|\d+) |
%o |
0[0-7]* |
%s |
\S+ |
%u |
\d+ |
%x , %X |
0[xX][\dA-Fa-f]+ |
Per estrarre il nomefile e i numeri da una stringa come questa
/usr/sbin/sendmail - 0 errors, 4 warnings
potreste usare una stringa di formattazione per scanf() come
%s - %d errors, %d warnings
L'equivalente espressione regolare potrebbe essere
(\S+) - (\d+) errors, (\d+) warnings
Se create espressioni regolari che richiedono all'automa di effettuare
molte ricorsioni, potreste incappare in un'eccezione di tipo
RuntimeError con un messaggio (maximum recursion limit
) che vi
avvisa del superamento del limite massimo per la ricorsione.
Per esempio,
>>> import re >>> s = 'Begin ' + 1000*'a very long string ' + 'end' >>> re.match('Begin (\w| )*? end', s).end() Traceback (most recent call last): File "<stdin>", line 1, in ? File "/usr/local/lib/python2.3/sre.py", line 132, in match return _compile(pattern, flags).match(string) RuntimeError: maximum recursion limit exceeded
Potete spesso ristrutturare la vostra espressione regolare per evitare la ricorsione.
A partire da Python 2.3, il semplice uso del modello *? è un caso speciale per evitare la ricorsione. Così, l'espressione regolare di cui sopra può evitare la ricorsione venendo rimaneggiata come Begin [a-zA-Z0-9_ ]*?end. Come ulteriore beneficio, questa espressione regolare verrà eseguita più velocemente rispetto al suo equivalente ricorsivo.
Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.