4.2.6 Esempi

Simulare scanf()

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

Evitate la ricorsione

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.