2012-10-21 3 views

답변

2

를 사용하여 원시 문자열 :

>>> import re 
>>> re.sub(r'(\[*?)', r'\1', 'x[[[y') 
'x[[[y' 

당신이 '\1' 쓰기, \1는 이스케이프 시퀀스로 해석되고있다. '\\1'r'\1'과 동일한 일반 문자열로 쓰는 적절한 방법입니다.

+0

정말 고맙습니다. – UhBaUnTaUh

1

\[*?은 마지 막으로 0 개 이상의 대괄호와 일치합니다. 다시 말해서, 언제 어디서나 적용 할 수 있습니다.

수량 한정자는 일반적으로 정규식을 허용하면서 최대한 일치하는 것을 의미합니다. 그것은 "역 추적"이 대부분의 시간을 의미합니다. 욕심을 많이내는 양화 기호는 사람들이 뒤죽박죽으로 튀어 나오므로 정규식의 나머지 부분이 필요로하는 것과 일치 할 수 있습니다.

릴럭 턴트 수량 기호는 반대의 역할을합니다. 처음에는 최소 문자 수를 소비하고 전체 일치를 달성하는 데 필요한 경우에만 더 많은 양을 차지합니다. 그러나 귀하의 경우에는 결코 필요하지 않습니다. \[*?은 전체 정규식이므로 빈 문자열과 일치하는 내용입니다. 결코은 regectant 수량 한정자를 정규식의 마지막 항목으로 사용하는 것이 좋습니다.

그냥 가능한 모든 혼란을 정리하기 위해, 원래 문자열의 괄호 캡처 다시 삽입되지 않습니다, 그들은 단지 xy 등, 왼쪽 당하고 있습니다. - @Blender 제안대로 원시 문자열을 사용했다면 (정확하게 즉 다른 오류했다), 당신의 출력은 원래 문자열이었을 것입니다 :

>>> re.sub(r"(\[*?)",r"\1","x[[[y") 
'x[[[y' 

그것은 (모든 문자의 경계 즉, 시작을 빈 문자열을 일치하는 것 끝나고 각 쌍의 문자 사이에) 삽입하고 다시 삽입하십시오. 나는 당신이 달성하려고했는지 모르겠지만, 당신이 하나를 사용하여 세 개의 브래킷을 교체하기를 원한다면, 당신은 대신 *?+을 사용해야, 당신은 캡처 그룹 외부를 했어야 :

>>> re.sub(r"(\[)+",r"\1","x[[[y") 
'x[y'