Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python 정규식에서 '?:'의 의미 – 캡처하지 않는 그룹(Non-capturing Group) 완벽 정리

캡처하지 않는 그룹(Non-capturing Group)이란?

정규식에서 특정 그룹이 매치된 내용을 캡처하지 않도록 하고 싶다면, 패턴을 Set(?:Value) 형태로 작성하면 됩니다. 여는 괄호 바로 뒤에 붙는 물음표(?)와 콜론(:)이 바로 '캡처하지 않는 그룹'을 선언하는 문법입니다.

Set(Value)?Set 또는 SetValue와 매치됩니다. 전자의 경우 첫 번째(그리고 유일한) 캡처 그룹은 비어 있게 되고, 후자의 경우 첫 번째 캡처 그룹이 Value를 저장합니다. 패턴 맨 끝에 붙은 물음표는 바로 앞 토큰을 선택 사항으로 만드는 수량자(quantifier)입니다.

반면 Set(?:Value)? 역시 Set 또는 SetValue와 매치되지만, 매치된 부분이 캡처 버퍼에 저장되지 않습니다. 즉, 이후에 역참조(backreference)를 하거나 그룹별로 매치 결과를 추출할 때 해당 그룹은 완전히 무시됩니다. 매치 범위를 묶기만 하고 결과를 남기지 않아야 할 때 유용합니다.

color=(?:red|green|blue)는 캡처하지 않는 그룹을 사용하는 또 다른 예입니다. 이 정규식에는 수량자가 없으며, 세 가지 색상 문자열을 하나의 단위로 묶어 처리할 뿐 별도로 캡처하지 않습니다.

추가로 알아두면 좋은 점

이름 있는 캡처(named capture)를 지원하는 정규식 엔진 중 일부는, 이름 없는 모든 그룹을 자동으로 캡처하지 않는 그룹으로 취급하는 옵션을 제공하기도 합니다. 이를 활용하면 불필요한 캡처로 인한 성능 저하와 그룹 번호 관리의 혼란을 줄일 수 있습니다.