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(' ', '')
— 링고 유쾌한에게

답변:


121

정규식에 원시 문자열을 사용해야합니다. 다음을 시도하십시오.

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 for any read this.
— Richard

1
또한 raw 문자열이 무엇인지 더 잘 설명하려면 stackoverflow.com/questions/2081640/…
— Richard

위의 예에서 실제로 그룹 이름을 어떻게 인쇄합니까? xCoord\1 라는 그룹이 있는 경우 하위 문자열을 그룹 이름으로 바꾸 도록 지시 하여 문자열 리터럴re.subre.sub(r"(\d), (\d)", r"\1,\2", coords)xCoord,52.25378
— zelusp

이것은 Python3에서 작동하지 않습니다. 사용하면 \1기괴한 유니 코드 문자로 대체됩니다.
— Cerin

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.