Python Regular Expressions å gjennomføre streng avkodingsverktøy

stemmer
12

Jeg prøver å implementere streng avkodingsverktøy med Python regex og referanser, og det ser ikke ut til å ønske å fungere veldig bra. Jeg er sikker på at det er noe jeg gjør galt, men jeg kan ikke finne ut hva ...

>>> import re
>>> mystring = rThis is \n a test \r
>>> p = re.compile( \\\\(\\S) )
>>> p.sub( \\1, mystring )
'This is n a test r'
>>> p.sub( \\\\\\1, mystring )
'This is \\n a test \\r'
>>> p.sub( \\\\1, mystring )
'This is \\1 a test \\1'

Jeg vil gjerne erstatte \\ [røye] med \ [røye], men referanser i Python ser ikke ut til å følge de samme reglene som de gjør i alle andre implementeringen jeg noensinne har brukt. Kan noen kaste lys?

Publisert på 17/08/2008 klokken 18:20
kilden bruker
På andre språk...                            


5 svar

stemmer
8

Er ikke det hva Anders' andre eksempelet gjør?

I 2.5 er det også et string-escapekodings du kan bruke:

>>> mystring = r"This is \n a test \r"
>>> mystring.decode('string-escape')
'This is \n a test \r'
>>> print mystring.decode('string-escape')
This is 
 a test 
>>> 
Svarte 17/08/2008 kl. 21:36
kilden bruker

stemmer
3

Vel, jeg tror du kan ha gått glipp r eller miscounted de backslashes ...

"\\n" == r"\n"

>>> import re
>>> mystring = r"This is \\n a test \\r"
>>> p = re.compile( r"[\\][\\](.)" )
>>> print p.sub( r"\\\1", mystring )
This is \n a test \r
>>>

Som, hvis jeg forstått er hva som ble forespurt.

Jeg mistenker at mer vanlig forespørsel er dette:

>>> d = {'n':'\n', 'r':'\r', 'f':'\f'}
>>> p = re.compile(r"[\\]([nrfv])")
>>> print p.sub(lambda mo: d[mo.group(1)], mystring)
This is \
 a test \
>>>

Den interesserte student bør også lese Ken Thompson Reflections on Tillitsfull Trust" , hvor vår helt bruker et lignende eksempel for å forklare farene ved å stole kompilatorer du ikke har bootstrapped fra maskinkode selv.

Svarte 17/08/2008 kl. 19:01
kilden bruker

stemmer
1

Tanken er at jeg vil lese i en rømt streng, og unescape det (en funksjon spesielt mangler fra Python, som du ikke skulle ha behov for å ty til regulære uttrykk for i første omgang). Dessverre jeg ikke blir lurt av backslashes ...

Et annet illustrerende eksempel:

>>> mystring = r"This is \n ridiculous"
>>> print mystring
This is \n ridiculous
>>> p = re.compile( r"\\(\S)" )
>>> print p.sub( 'bloody', mystring )
This is bloody ridiculous
>>> print p.sub( r'\1', mystring )
This is n ridiculous
>>> print p.sub( r'\\1', mystring )
This is \1 ridiculous
>>> print p.sub( r'\\\1', mystring )
This is \n ridiculous

Det jeg ønsker å skrive ut er

This is 
ridiculous
Svarte 17/08/2008 kl. 19:40
kilden bruker

stemmer
0

Merke; hans andre eksempel krever hver rømt karakter kastet inn i en matrise i utgangspunktet, noe som genererer en KeyError hvis escape-sekvens skjer ikke å være i matrisen. Det vil dø på noe, men de tre tegnene følger (gi \ va forsøk), og opplisting alle mulige escape-sekvens hver gang du ønsker å unescape en streng (eller holde en global array) er en veldig dårlig løsning. Analogt til PHP, som er ved hjelp av preg_replace_callback()med en lambda istedenfor preg_replace(), som er helt unødvendig i denne situasjon.

Jeg beklager hvis jeg kommer ut som en pikk om det, jeg er bare helt frustrert med Python. Dette støttes av alle andre vanlige uttrykket motoren jeg noen gang har brukt, og jeg kan ikke forstå hvorfor dette ikke ville fungere.

Takk for å svare; den string.decode('string-escape')funksjonen er nettopp det jeg var ute etter i utgangspunktet. Hvis noen har en generell løsning på regex backreference problem, gjerne legge det ut, og jeg vil akseptere det som et svar også.

Svarte 17/08/2008 kl. 21:55
kilden bruker

stemmer
0

Du blir lurt av Python representasjon av resultatet streng. Python uttrykk:

'This is \\n a test \\r'

representerer strengen

This is \n a test \r

som er jeg tror det du ville. Prøv å legge til 'print' foran hver av p.sub () kaller å skrive ut selve strengen tilbake i stedet for en Python representasjon av strengen.

>>> mystring = r"This is \n a test \r"
>>> mystring
'This is \\n a test \\r'
>>> print mystring
This is \n a test \r
Svarte 17/08/2008 kl. 19:26
kilden bruker

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