Yedekli alt değiştirme deseninde yakalama grupları için geri referansları işleme


88

Dizeyi 0.71331, 52.25378alıp geri dönmek istiyorum 0.71331,52.25378- yani sadece bir rakam, bir virgül, bir boşluk ve bir rakam arayın ve boşluğu kaldırın.

Bu benim şu anki kodum:

coords = '0.71331, 52.25378'
coord_re = re.sub("(\d), (\d)", "\1,\2", coords)
print coord_re

Ama bu bana verir 0.7133,2.25378. Neyi yanlış yapıyorum?


4
Aslında rakamlarını yakalamak istemiyorum yana, yani kullanım göz arounds daha mantıklı, yapabilir: re.sub(r'(?<=\d), (?=\d)', ',', coords).
ig0774

1
Regex gerek yoktur Bu özel bir soru, kullanım değiştirin: coords.replace(' ', '')
Gringo SUAVE

Yanıtlar:


120

Normal ifade için ham dizeler kullanmalısınız, aşağıdakileri deneyin:

coord_re = re.sub(r"(\d), (\d)", r"\1,\2", coords)

Mevcut kodunuzla, ikame dizenizdeki ters eğik çizgiler rakamlardan kaçıyor, bu nedenle tüm eşleşmeleri şunun eşdeğeriyle değiştiriyorsunuz chr(1) + "," + chr(2):

>>> '\1,\2'
'\x01,\x02'
>>> print '\1,\2'
,
>>> print r'\1,\2'   # this is what you actually want
\1,\2

Dizede ters eğik çizgiyi bırakmak istediğinizde, röneki kullanın veya her ters eğik çizgiden ( \\1,\\2) kaçının .


2
Teşekkürler, hile yaptı. docs.python.org/library/re.html#raw-string-notation bunu okuyan herkes için.
Richard

1
Ham dizelerin daha iyi bir açıklaması için ayrıca stackoverflow.com/questions/2081640/… .
Richard

Yukarıdaki örnekte grup adını gerçekten nasıl yazdırırsınız? Diyelim ki, grup xCoord olarak\1 adlandırılırsa , alt dizeleri grup isimleriyle değiştirme talimatı vermek mümkün , re.suböyle ki re.sub(r"(\d), (\d)", r"\1,\2", coords)değişmez dize ile sonuçlanırxCoord,52.25378
zelusp

Bu Python3'te çalışmaz. Kullanmak \1onu bazı tuhaf unicode karakterlerle değiştirir.
Cerin

16

Python \1, ASCII değeri 1 olan bir karakter olarak yorumlar ve bunu'a iletir sub.

Python'un \.

coord_re = re.sub(r"(\d), (\d)", r"\1,\2", coords)

Daha fazla bilgiye ihtiyacınız olursa , bu rebelgenin hemen başında ele alınmıştır .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.