Python re.sub med et flagg ikke erstatte alle forekomster

stemmer
44

Python docs si:

re.MULTILINE: Når spesifisert, mønsteret tegnet '^' stemmer overens ved begynnelsen av strengen, og ved begynnelsen av hver linje (umiddelbart etter hver ny linje) ... Som standard '^' sams bare ved begynnelsen av strengen ...

Så hva skjer når jeg får følgende uventet resultat?

>>> import re
>>> s = // The quick brown fox.
... // Jumped over the lazy dog.
>>> re.sub('^//', '', s, re.MULTILINE)
' The quick brown fox.\n// Jumped over the lazy dog.'
Publisert på 03/09/2008 klokken 21:00
kilden bruker
På andre språk...                            


3 svar

stemmer
99

Se på definisjonen av re.sub:

sub(pattern, repl, string[, count])

Den fjerde argumentet er teller, du bruker re.MULTILINE(som er 8) som teller, ikke som et flagg.

Du må kompilere din regex hvis du ønsker å bruke flagg.

re.sub(re.compile('^//', re.MULTILINE), '', s)

Et flagsargument ble tilsatt i Python 2.7, slik at den fullstendige definisjon er nå:

re.sub(pattern, repl, string[, count, flags])

Som betyr at:

re.sub('^//', '', s, flags=re.MULTILINE)

virker.

Svarte 03/09/2008 kl. 21:08
kilden bruker

stemmer
10
re.sub('(?m)^//', '', s)
Svarte 25/03/2010 kl. 16:10
kilden bruker

stemmer
6

Den fullstendige definisjonen av re.subIS:

re.sub(pattern, repl, string[, count, flags])

Hvilket betyr at hvis du forteller Python hva parametrene er, så du kan passere flagsuten bestått count:

re.sub('^//', '', s, flags=re.MULTILINE)

eller, mer presist:

re.sub('^//', '', s, flags=re.M)
Svarte 30/08/2011 kl. 18:33
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more