Chcę wziąć ciąg 0.71331, 52.25378
i zwrócić 0.71331,52.25378
- tj. Po prostu poszukaj cyfry, przecinka, spacji i cyfry i usuń spację.
To jest mój obecny kod:
coords = '0.71331, 52.25378'
coord_re = re.sub("(\d), (\d)", "\1,\2", coords)
print coord_re
Ale to mi daje 0.7133,2.25378
. Co ja robię źle?
re.sub(r'(?<=\d), (?=\d)', ',', coords)
. : .coords.replace(' ', '')
Odpowiedzi:
Powinieneś używać nieprzetworzonych ciągów dla wyrażenia regularnego, spróbuj wykonać następujące czynności:
coord_re = re.sub(r"(\d), (\d)", r"\1,\2", coords)
W obecnym kodzie ukośniki odwrotne w zastępczym ciągu znaków zastępują cyfry, więc zastępujesz wszystkie dopasowania odpowiednikami
chr(1) + "," + chr(2)
:>>> '\1,\2' '\x01,\x02' >>> print '\1,\2' , >>> print r'\1,\2' # this is what you actually want \1,\2
Za każdym razem, gdy chcesz pozostawić ukośnik odwrotny w ciągu, użyj
r
przedrostka lub użyj znaku ucieczki przed każdym ukośnikiem odwrotnym (\\1,\\2
).źródło
\1
nazywana xCoord , czy można poinstruować,re.sub
aby zastąpić łańcuchy podrzędne nazwami grup takimi, którere.sub(r"(\d), (\d)", r"\1,\2", coords)
spowodowałyby literał ciąguxCoord,52.25378
\1
zastępuje go jakimś dziwacznym znakiem Unicode.Python interpretuje
\1
znak jako znak o wartości ASCII 1 i przekazuje go dosub
.Użyj nieprzetworzonych ciągów, w których Python nie interpretuje
\
.coord_re = re.sub(r"(\d), (\d)", r"\1,\2", coords)
Jest to omówione na początku
re
dokumentacji , jeśli potrzebujesz więcej informacji.źródło