re.sub置換パターンでのキャプチャグループへの後方参照の処理


88

文字列を取得して0.71331, 52.25378返したいのですが、0.71331,52.25378つまり、数字、コンマ、スペース、数字を探して、スペースを取り除きます。

これは私の現在のコードです:

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

しかし、これは私に与えます0.7133,2.25378。私は何が間違っているのですか?


4
実際には数字をキャプチャしたくないので、ルックアラウンドを使用する方が理にかなっている場合がありますre.sub(r'(?<=\d), (?=\d)', ',', coords)
ig0774 2011年

1
この特定の質問正規表現を必要としない、使用は交換してください: coords.replace(' ', '')
グリンゴサーブ

回答:


120

正規表現には生の文字列を使用する必要があります。次のことを試してください。

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

現在のコードでは、置換文字列のバックスラッシュが数字をエスケープしているため、次と同等のすべての一致を置換していますchr(1) + "," + chr(2)

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

文字列に円記号を残したいときはいつでも、r接頭辞を使用するか、各円記号(\\1,\\2)をエスケープしてください。


2
おかげで、それはトリックをしました。これを読んでいる人のためのdocs.python.org/library/re.html#raw-string-notation
リチャード

1
また、生の文字列が何であるかについてのより良い説明のためにstackoverflow.com/questions/2081640/…
リチャード

上記の例で実際にグループ名をどのように印刷しますか?たとえば、グループ\1xCoordと呼ばれる場合re.sub、サブ文字列をグループ名に置き換えてre.sub(r"(\d), (\d)", r"\1,\2", coords)、文字列リテラルになるように指示することは可能ですかxCoord,52.25378
zelusp 2016

これはPython3では機能しません。を使用\1すると、奇妙なUnicode文字に置き換えられます。
セリン2017年

16

Pythonは、\1をASCII値1の文字として解釈し、それをに渡しsubます。

Pythonがを解釈しない生の文字列を使用し\ます。

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

詳細が必要な場合は、reドキュメントの冒頭で説明しています

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.