Lookaround를 이용한 정규 표현식
:
(?<!_)example_keyword(?!_)의 이해
정규 표현식은 단순한 문자열 일치를 넘어서, 텍스트의 맥락(Context) 에 따라 정교하게 검색 조건을 설정할 수 있게 해준다. 그중에서도 Lookaround(룩어라운드) 는 어떤 패턴이 특정 조건 아래에 있을 때만 일치하도록 제어할 수 있는 기능이다.
이 문서에서는 Lookaround의 두 형태인 Lookbehind와 Lookahead를 설명하고, 이를 활용한 예제로
(?<!_)example_keyword(?!_) 같은 패턴을 분석한다.
⸻
- Lookaround란 무엇인가?
Lookaround는 말 그대로, 우리가 찾으려는 대상 문자열의 “주변을 살펴보는” 역할을 한다. 특징은, 문자열의 일치 조건을 검사하되, 그 주변 문자를 실제로 포함하지는 않는다. 즉, 조건은 체크하지만 매칭 결과에 영향을 주지 않는다.
Lookaround는 네 가지 형태가 있다:
| 종류 | 설명 | 예시 |
|---|---|---|
(?=…) | 긍정형 전방 탐색 (Positive Lookahead) | 뒤에 특정 패턴이 있는 경우 |
(?!…) | 부정형 전방 탐색 (Negative Lookahead) | 뒤에 특정 패턴이 없는 경우 |
(?<=…) | 긍정형 후방 탐색 (Positive Lookbehind) | 앞에 특정 패턴이 있는 경우 |
(?<!…) | 부정형 후방 탐색 (Negative Lookbehind) | 앞에 특정 패턴이 없는 경우 |
⸻
- 실제 예제:
(?<!_)example_keyword(?!_)
이제 이 Lookaround 기능이 실제로 어떻게 사용되는지를 살펴보자.
패턴:
(?<!_)example_keyword(?!_)
목적:
example_keyword라는 단어를 찾되, 그 앞뒤에 밑줄(_)이 없는 경우에만 일치시키고 싶을 때 사용한다.
구성 설명:
• (?<!_): 이 부분은 부정형 후방 탐색이다.
→ example_keyword 앞에 밑줄이 있으면 매칭하지 않는다.
• example_keyword: 우리가 찾고자 하는 실제 문자열이다.
• (?!_): 이 부분은 부정형 전방 탐색이다.
→ example_keyword 뒤에 밑줄이 있으면 매칭하지 않는다.
이렇게 Lookbehind와 Lookahead를 함께 사용하면, 중심 문자열의 전후 문맥 조건을 동시에 검사할 수 있다.
⸻
- 예시와 결과
다음 문자열을 생각해보자:
example_keyword
example_keyword
example_keyword
example_keyword
정규 표현식 (?<!_)example_keyword(?!_)를 적용하면,
일치하는 것은 오직 첫 번째 “example_keyword” 뿐이다.
그 외의 경우는 앞이나 뒤에 밑줄이 있으므로 조건에서 제외된다.
⸻
- 왜 Lookaround가 중요한가?
Lookaround는 다음과 같은 상황에서 큰 도움이 된다: • 정확한 경계 판단이 필요한 경우 예: 어떤 단어가 다른 접두어나 접미어 없이 단독으로 등장했는지 검사할 때 • 불필요한 결과를 필터링하고 싶은 경우 예: 로그 분석 중 특정 키워드를 포함하지만, 특정 조건이 붙은 경우만 제외하고 싶을 때 • 문자열의 일치 범위를 제어하고 싶을 때 예: 특정 단어가 괄호 안에 있는 경우만 찾거나, 괄호 밖인 경우만 찾고 싶을 때
Lookaround는 이러한 요구를 만족시키면서도, 정규식 전체를 깔끔하고 읽기 쉽게 유지해준다.
⸻
- 주의할 점 • Lookaround는 조건을 “검사”만 하지, 일치 결과에는 포함되지 않는다. 즉, 실제로 추출되는 문자열에는 영향을 주지 않는다. • 일부 오래된 정규식 엔진은 Lookbehind를 지원하지 않는다. 예: JavaScript의 구버전, 일부 텍스트 편집기 등 • 복잡한 Lookaround를 과도하게 중첩하면 성능에 영향을 줄 수 있다. 간결한 패턴 구성이 중요하다.
⸻
- 요약
Lookaround는 정규 표현식에서 강력한 조건 검사 도구다.
특히 (?<!...)와 (?!...) 같은 부정형 탐색은 특정 조건을 제외하는 데 유용하다.
패턴 (?<!_)example_keyword(?!_)는, 앞뒤에 밑줄이 없는 경우에만 키워드를 찾고 싶을 때 정확하게 동작한다.
이처럼 Lookaround를 적절히 사용하면, 단순한 문자열 검색을 넘어서 문맥 기반의 정밀한 탐색과 필터링이 가능해진다.