2008-08-17 21 views
11

Python regex ve backreferences ile unescaping dizesini uygulamaya çalışıyorum ve çok iyi çalışmak istemiyor gibi görünmüyor. ... PythonPython Düzenlenmeyen dizgeyi uygulamak için düzenli ifadeler

>>> 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' 
Ben \\ \ [Char] ile [karakter] yerine istediğiniz

ama geribaşvuruları ben yapıyorum yanlış bir şey olduğuna eminim ama dışarı ne çözemiyorum Şimdiye kadar kullandığım diğer tüm uygulamalarda aynı kurallara uymuyorlar. Birisi biraz ışık tutabilir mi?

cevap

8

bu ne Anders değil mi olduğunu 'ikinci örnek yapar?

2.5 size uygulayabilirsiniz kodlayan ayrıca string-escape var:

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

Sanırım anlaşıldığı takdirde,

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

istendi budur ... Eğer r cevapsız veya ters eğik çizgi miscounted olabileceğini düşünüyorum.

Ben daha yaygın isteği bu şüpheli:

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

da okumalısınız ilgilenen öğrenci Ken Thompson Reflections on Trusting Trust", kahramanımız sizden önyükleyicisini değil güvenen derleyici tehlikelerini anlatmaya benzer bir örnek kullanır burada makine kodu kendiniz.

0

Python'un sonuç dizesini temsil etmesi tarafından kandırılıyorsunuz. Python ifadesi:

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

Ne istediğini düşünüyorum dize

This is \n a test \r 

temsil eder. Dizenin bir Python gösterimi yerine döndürülen gerçek dizeyi yazdırmak için p.sub() çağrılarınızın her birinin önüne 'print' eklemeyi deneyin.

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

fikri ben kaçan bir dizede okumak ve (bir özellik özellikle ilk etapta için düzenli ifadeler başvurmak gerekmez Python gelen eksik) onu okunabilir hale edeceğiz olmasıdır. Ne yazık ki

başka açıklayıcı örnek ... tersbölülerle kandırdın değilim:

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

İsterdim Ne yazdırmak için

This is 
ridiculous 
0

Mark; onun ikinci örneği, başlangıçta diziye atılan her bir kaçış karakteri gerektirir; bu, kaçış dizisinin dizide olmaması durumunda bir KeyError oluşturur. Her şeyden öte, ama verilen üç karakter (denemeyi deneyin) ve bir dizgenin (veya genel dizinin tutulması) her defasında, her olası kaçış dizisinin numaralandırılması gerçekten kötü bir çözümdür. PHP'ye benzer şekilde, preg_replace() yerine bir lambda ile preg_replace_callback() kullanıyoruz, bu da bu durumda tamamen gereksizdir.

Eğer bir dick olarak geldiğim için üzgünüm, Python ile tamamen sinirlendim.Bu, kullandığım her normal ifade motoru tarafından destekleniyor ve bunun neden işe yaramayacağını anlayamıyorum.

Yanıtladığınız için teşekkür ederiz; string.decode('string-escape') işlevi, başlangıçta tam olarak aradığım şey. Birisinin normal ifadeyle ilgili geri tepme problemine genel bir çözümü varsa, bunu yayınlamaktan çekinmeyin ve bunu bir cevap olarak kabul edeceğim.