내 실수는 무엇입니까?RegExp 잘못된 특수 문자 결과 그룹 참조
>>> import re
>>> re.sub("(\[*?)","\1","x[[[y")
'\x01x\x01[\x01[\x01[\x01y\x01'
어떻게하면됩니까? 정규식에 대한
내 실수는 무엇입니까?RegExp 잘못된 특수 문자 결과 그룹 참조
>>> import re
>>> re.sub("(\[*?)","\1","x[[[y")
'\x01x\x01[\x01[\x01[\x01y\x01'
어떻게하면됩니까? 정규식에 대한
를 사용하여 원시 문자열 :
>>> import re
>>> re.sub(r'(\[*?)', r'\1', 'x[[[y')
'x[[[y'
당신이 '\1'
쓰기, \1
는 이스케이프 시퀀스로 해석되고있다. '\\1'
은 r'\1'
과 동일한 일반 문자열로 쓰는 적절한 방법입니다.
\[*?
은 마지 막으로 0 개 이상의 대괄호와 일치합니다. 다시 말해서, 언제 어디서나 적용 할 수 있습니다.
수량 한정자는 일반적으로 정규식을 허용하면서 최대한 일치하는 것을 의미합니다. 그것은 "역 추적"이 대부분의 시간을 의미합니다. 욕심을 많이내는 양화 기호는 사람들이 뒤죽박죽으로 튀어 나오므로 정규식의 나머지 부분이 필요로하는 것과 일치 할 수 있습니다.
릴럭 턴트 수량 기호는 반대의 역할을합니다. 처음에는 최소 문자 수를 소비하고 전체 일치를 달성하는 데 필요한 경우에만 더 많은 양을 차지합니다. 그러나 귀하의 경우에는 결코 필요하지 않습니다. \[*?
은 전체 정규식이므로 빈 문자열과 일치하는 내용입니다. 결코은 regectant 수량 한정자를 정규식의 마지막 항목으로 사용하는 것이 좋습니다.
그냥 가능한 모든 혼란을 정리하기 위해, 원래 문자열의 괄호 캡처 다시 삽입되지 않습니다, 그들은 단지 x
및 y
등, 이 왼쪽 당하고 있습니다. - @Blender 제안대로 원시 문자열을 사용했다면 (정확하게 즉 다른 오류했다), 당신의 출력은 원래 문자열이었을 것입니다 :
>>> re.sub(r"(\[*?)",r"\1","x[[[y")
'x[[[y'
그것은 (모든 문자의 경계 즉, 시작을 빈 문자열을 일치하는 것 끝나고 각 쌍의 문자 사이에) 삽입하고 다시 삽입하십시오. 나는 당신이 달성하려고했는지 모르겠지만, 당신이 하나를 사용하여 세 개의 브래킷을 교체하기를 원한다면, 당신은 대신 *?
의 +
을 사용해야, 당신은 캡처 그룹 외부를 했어야 :
>>> re.sub(r"(\[)+",r"\1","x[[[y")
'x[y'
정말 고맙습니다. – UhBaUnTaUh