Python Düzenli İfadeler dize çıkış kaldırma uygulamak

oy
11

Ben Python regex ve geribaşvuruların ile dize çıkış kaldırma uygulamak çalışıyorum ve çok iyi çalışmak istediğiniz gibi görünmüyor. Ben yapıyorum yanlış bir şey olduğuna eminim ama ne çözemiyorum ...

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

Ben \\ \ [Char] ile [kömürü] değiştirmek istediğiniz, ancak Python geribaşvurularla onlar şimdiye kadar kullandığım her uygulamada yapmak aynı kurallara uymak görünmüyor. Birisi bazı ışık tutacak misiniz?

Oluştur 17/08/2008 saat 17:20
kaynak kullanıcı
Diğer dillerde...                            


5 cevaplar

oy
3

Pekala, senin r cevapsız veya ters eğik çizgi miscounted olabileceğini düşünüyorum ...

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

Ki, anladım eğer istendi budur.

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

Ilgilenen öğrenci de Ken Thompson'ın okumalısınız Güvenen Trust" Üzerine Düşünceler kahramanımız Makine koduna kendiniz gelen önyükleyicisini değil derleyiciler güvenen tehlikelerini anlatmaya benzer bir örnek kullanır burada.

Cevap 17/08/2008 saat 18:01
kaynak kullanıcı

oy
0

Sen sonuç dizesinin Python'un temsiliyle kandırdın ediliyor. Python ifadesi:

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

dizeyi temsil

This is \n a test \r

hangi Ne istediğini düşünüyorum. senin p.sub her () önünde 'baskı' eklemeyi deneyin gerçek bir dize yerine dize Python temsilinin iade yazdırmak için çağırır.

>>> mystring = r"This is \n a test \r"
>>> mystring
'This is \\n a test \\r'
>>> print mystring
This is \n a test \r
Cevap 17/08/2008 saat 18:26
kaynak kullanıcı

oy
0

Aslında yapılması 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 tersbölülerle kandırdın değilim ...

Diğer bir açıklayıcı örneği:

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

Ben ise o yazdırmak istiyorum ne

This is 
ridiculous
Cevap 17/08/2008 saat 18:40
kaynak kullanıcı

oy
8

O Anders' İkinci örnek yapar bu değil mi?

2.5 Bir de var string-escapeuygulayabilirsiniz kodlama:

>>> 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 
>>> 
Cevap 17/08/2008 saat 20:36
kaynak kullanıcı

oy
0

İşaret; ikinci örnek çıkış sırası dizide olmamaya olmuyorsa bir KeyError oluşturur başlangıçta bir diziye atılan her kaçan karakteri gerektirir. Bu sağlanan üç karakterden şey ama (\ va denemeye) ölüme ve olası her çıkış sırası bir dize okunabilir hale getirmek için istediğiniz her zaman numaralandırma (veya global dizi tutarak) gerçekten kötü bir çözümdür olacaktır. Kullanıyor PHP, benzer preg_replace_callback()yerine lambda'da preg_replace()bu durumda tamamen gereksizdir.

Ben bu konuda Dick olarak yola geliyorum kusura bakma, ben sadece tamamen sinirli Python birlikteyim. Bu şimdiye kadar kullandığım her düzenli ifade motoru tarafından desteklenir ve bu işe yaramaz neden anlayamıyorum.

Yanıt için teşekkür ederiz; string.decode('string-escape')Fonksiyon i başlangıçta arıyordu şeydir. Birisi regex geribaşvuru sorununa genel bir çözüm varsa, göndermeye çekinmeyin ve ben de bir cevap olarak kabul edeceğiz.

Cevap 17/08/2008 saat 20:55
kaynak kullanıcı

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