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.