Vra

Ek probeer om te implementeer string unescaping met Python regex en backreferences, en dit lyk nie te wil om te werk baie goed.Ek is seker dit is iets wat ek verkeerd doen nie, maar ek kan nie uitvind wat...

>>> import re
>>> mystring = r"This 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'

Ek wil graag om te vervang \\[char] met \[char], maar backreferences in Python verskyn nie, volg dieselfde reëls wat hulle doen in elke ander implementering ek nog ooit gebruik word.Kan iemand bietjie lig werp?

Was dit nuttig?

Oplossing

Is dit nie wat Anders 'n tweede voorbeeld doen?

Daar is In 2.5 het ook 'n string-escape kodering jy kan aansoek doen:

>>> 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 
>>> 

Ander wenke

Wel, ek dink jy dalk gemis het die r of miscounted die 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
>>>

Wat, as ek verstaan is wat versoek word.

Ek vermoed die meer algemene versoek is hierdie:

>>> 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 \
>>>

Die belangstellende student moet ook lees Ken Thompson se Refleksies op Vertrou Vertrou", waarin ons held maak gebruik van'n soortgelyke voorbeeld om te verduidelik die gevare van vertroue opstellers jy nog nie bootstrapped van die masjien kode jouself.

Die idee is dat ek sal lees in 'n ontsnap string, en escapen dit ( 'n kenmerk veral ontbreek van Python, wat jy nie moet nodig om plek te gereelde uitdrukkings in die eerste plek). Ongelukkig ek nie om die bos gelei deur die skuinsstrepe ...

Nog 'n illustratiewe voorbeeld:

>>> 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

Wat ek wil dit om te druk is

This is 
ridiculous

Jy word mislei deur verteenwoordiging van die resultaat string Python se. Die Python uitdrukking:

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

verteenwoordig die string

This is \n a test \r

wat ek dink wat jy wil. Probeer die toevoeging van 'druk' in die voorkant van elk van jou p.sub () oproepe na die werklike string plaas teruggekeer van 'n Python voorstelling van die string te druk.

>>> mystring = r"This is \n a test \r"
>>> mystring
'This is \\n a test \\r'
>>> print mystring
This is \n a test \r

Merk;sy tweede voorbeeld vereis dat elke ontsnap karakter gegooi word in'n verskeidenheid aanvanklik, wat genereer'n KeyError as die ontsnap volgorde gebeur nie om te wees in die skikking.Dit sal sterf op enigiets nie, maar die drie karakters wat verskaf word (gee \v'n probeer), en die opname van elke moontlike ontsnapping ry elke keer as jy wil om te unescape'n string (of die behoud van'n globale skikking) is'n baie slegte oplossing.Analoog aan PHP, dit is met behulp van preg_replace_callback() met'n lambda in plaas van preg_replace(), wat is heeltemal onnodig in hierdie situasie.

Ek is jammer as ek af kom soos'n piel oor dit, ek is net heeltemal gefrustreerd met Python.Dit word ondersteun deur al die ander gereelde uitdrukking enjin wat ek nog ooit gebruik word, en ek kan nie verstaan hoekom dit nie sou werk nie.

Dankie vir reageer;die string.decode('string-escape') funksie is presies wat ek was op soek vir aanvanklik.As iemand het'n algemene oplossing vir die regex backreference probleem, voel vry om dit te plaas en ek sal aanvaar dat so'n antwoord as goed.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top