일부 정규 표현식 엔진은 문자 클래스(character class) 내부에서 강력한 집합 연산을 수행할 수 있도록 지원합니다. 이를 활용하면 다음과 같은 정교한 매칭이 가능합니다.
- 차집합(Subtraction): 한 클래스에는 속하지만 다른 클래스에는 속하지 않는 문자 매칭
- 교집합(Intersection): 두 클래스 모두에 속하는 문자 매칭
- 합집합(Union): 여러 클래스 중 어느 하나라도 속하는 문자 매칭
문자 클래스 연산이란?
문자 클래스 연산은 대괄호 [] 안의 문자 집합들을 마치 수학의 집합처럼 다루는 기능입니다. 복잡한 조건을 하나의 패턴으로 간결하게 표현할 수 있어, 특정 범위의 문자에서 불필요한 문자를 제외하거나 여러 조건을 동시에 만족하는 문자를 찾을 때 유용합니다.
교집합(Intersection): && 연산자
여러 문자 클래스의 교집합을 구할 때는 AND 연산자인 &&를 사용합니다.
형식: [...&&[...]]
이 패턴은 두 하위 클래스의 교집합을 나타내며, 매칭되는 문자는 반드시 두 하위 클래스 모두에 속해야 합니다.
예시: [\S&&[\D]]
공백 문자가 아니면서(\S) 동시에 숫자가 아닌(\D) 문자 하나와 일치합니다.
차집합(Subtraction): -- 연산자
한 문자 클래스에서 다른 클래스에 해당하는 문자를 빼고 싶을 때는 하이픈 두 개(--)로 차집합을 표현합니다.
예시: [a-z--[aeiou]]
영어 소문자 중에서 모음(aeiou)을 제외한, 즉 소문자 자음과 일치합니다.
또한, 빼려는 클래스에 범위(-)가 포함되어 있지 않다면 대괄호를 생략할 수 있습니다. 따라서 위 패턴은 다음과 같이 더 간단하게 쓸 수도 있습니다.
[a-z--aeiou]
합집합(Union): || 연산자
여러 문자 클래스의 합집합을 만들 때는 OR 연산자인 ||를 사용합니다.
예시: [0||[^\W\d]]
숫자 0이거나, 또는 숫자가 아닌 단어 문자(word character)와 일치합니다.
파이썬에서 활용하기 위한 참고 사항
파이썬의 기본 내장 re 모듈은 위와 같은 문자 클래스 연산(&&, --, ||)을 지원하지 않습니다. 이 기능을 사용하려면 확장 기능을 제공하는 서드파티 regex 모듈을 설치하여 사용하는 것이 좋습니다.
pip install regeximport regex as re 형태로 임포트하면 기존 re 모듈처럼 익숙하게 사용하면서 문자 클래스 연산 등 고급 기능을 활용할 수 있습니다.