Behandeln von Rückverweisen auf das Erfassen von Gruppen im Ersetzungsmuster

88

Ich möchte die Zeichenfolge nehmen 0.71331, 52.25378und zurückkehren 0.71331,52.25378- dh nur nach einer Ziffer, einem Komma, einem Leerzeichen und einer Ziffer suchen und das Leerzeichen entfernen.

Dies ist mein aktueller Code:

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

Aber das gibt mir 0.7133,2.25378. Was mache ich falsch?

Richard
quelle
4
Da Sie die Ziffern eigentlich nicht erfassen möchten, ist es möglicherweise sinnvoller, sich umzuschauen, z re.sub(r'(?<=\d), (?=\d)', ',', coords).
ig0774
1
Diese spezielle Frage braucht keine Regex, verwenden Sie ersetzen: coords.replace(' ', '')
Gringo Suave

Antworten:

119

Sie sollten rohe Zeichenfolgen für Regex verwenden. Versuchen Sie Folgendes:

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

Mit Ihrem aktuellen Code werden die Backslashes in Ihrer Ersatzzeichenfolge nicht in den Ziffern angezeigt, sodass Sie alle Übereinstimmungen ersetzen, die den folgenden Angaben entsprechen chr(1) + "," + chr(2):

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

Wenn Sie den Backslash in der Zeichenfolge belassen möchten, verwenden Sie das rPräfix oder maskieren Sie jeden Backslash ( \\1,\\2).

Andrew Clark
quelle
2
Danke, das hat den Trick gemacht. docs.python.org/library/re.html#raw-string-notation für alle, die dies lesen.
Richard
1
Auch stackoverflow.com/questions/2081640/… für eine bessere Erklärung der Rohzeichenfolgen .
Richard
Wie würden Sie den Gruppennamen im obigen Beispiel tatsächlich drucken? Angenommen , wenn die Gruppe xCoord\1 heißt , ist es möglich, die Unterzeichenfolgen durch Gruppennamen zu ersetzen, die zum Zeichenfolgenliteral führtenre.subre.sub(r"(\d), (\d)", r"\1,\2", coords)xCoord,52.25378
zelusp
Dies funktioniert in Python3 nicht. Die Verwendung \1ersetzt es durch ein bizarres Unicode-Zeichen.
Cerin
16

Python interpretiert das \1als Zeichen mit dem ASCII-Wert 1 und übergibt es an sub.

Verwenden Sie rohe Zeichenfolgen, in denen Python das nicht interpretiert \.

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

Dies wird gleich zu Beginn der reDokumentation behandelt , falls Sie weitere Informationen benötigen.

Petr Viktorin
quelle