파이썬 re.sub 그룹 : \ number 이후의 숫자


183

로 바꾸려면 어떻게 foobar해야 foo123bar합니까?

작동하지 않습니다.

>>> re.sub(r'(foo)', r'\1123', 'foobar')
'J3bar'

이것은 작동합니다 :

>>> re.sub(r'(foo)', r'\1hi', 'foobar')
'foohibar'

과 같은 것을 가질 때 일반적인 문제라고 생각합니다 \number. 누구든지 이것을 처리하는 방법에 대한 힌트를 줄 수 있습니까?


2
이 질문은 "그룹"아래 의 스택 오버플로 정규 표현식 FAQ 에 추가되었습니다 .
aliteralmind

1
이 질문은 '캡처 그룹'또는 '숫자 그룹 참조'라는 용어가 포함되어 있지 않기 때문에 찾는 데 오랜 시간이 걸렸습니다.
Mark Ch

1
문제는 r '\ 112'가 8 진 리터럴 0112, ASCII'J '또는 10 진수 74로 해석된다는 것입니다. 문자열을 연결하기 전에 역 참조'\ 1 '을 강제로 평가하는 방법을 볼 수 없습니다.''.join()
smci

질문에서 약간의 편차, 모든 그룹 일치를 참조하는 방법, 즉 r '\ <모든 일치> hi'?
Sayan Dey

답변:


312

정답은:

re.sub(r'(foo)', r'\g<1>123', 'foobar')

문서에서 관련 발췌 :

위에서 설명한대로 문자 이스케이프 및 역 참조 외에도 \ g는 (? P ...) 구문에 정의 된대로 name이라는 그룹과 일치하는 하위 문자열을 사용합니다. \ g는 해당 그룹 번호를 사용합니다. 따라서 \ g <2>는 \ 2와 동일하지만 \ g <2> 0과 같은 대체물에서는 모호하지 않습니다. \ 20은 그룹 2에 대한 참조가 아니라 리터럴 문자 '0'이 아닌 그룹 20에 대한 참조로 해석됩니다. 역 참조 \ g <0>은 RE와 일치하는 전체 하위 문자열을 대체합니다.


48
너무 열심히하지 마십시오. 그것은 것 문서에 묻혀 지금까지 깊은 자신의 질문을 구글이 대답은 SO에 올라와있는 것보다이 대부분의 사람들에게 문서를 읽을 수있는 훨씬 더 많은 시간이 걸릴 것이다.
speedplane

1
제공되는 정확한 인용이 발견 여기에 당신이 상황을 찾고있는 경우
패트릭

그룹을 가져 가서 수정할 수 있습니까? \ g <1> ... 예를 들어,이 경우 g <1>은 foo이지만, "fuu"와 같이 o를 o로 바꾸고 싶습니다
Eric Bellet
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.