안녕하세요! 이 게시물에서는 파이썬에서 정규표현식을 사용할 때 유의해야 할 특성을 정리해보도록 하겠습니다.
파이썬으로 문자열을 다루다 보면 정규표현식을 사용하게 되는 경우가 많습니다.
정규표현식이란, 문자열 내에서 특정한 규칙을 찾는 문자열을 찾기 위해 사용하는 표현입니다.
파이썬에서는 기본적으로 're'라는 모듈을 통해서 정규표현식을 사용할 수 있도록 하고 있습니다.
그런데 이 모듈을 사용하면서, 생각처럼 잘 작동하지 않는 경험을 하실 수도 있을 텐데요,
re 모듈의 특성을 알고 나면 본인이 원하는대로 정규표현식을 사용할 수 있으리라 생각합니다!
Regular Expression HOWTO — Python 3.9.7 documentation
regex - What do 'lazy' and 'greedy' mean in the context of regular expressions? - Stack Overflow
1. 'greedy'하다
: 전체 문자열 중, 해당 패턴을 만족하는 가장 긴 문자열을 반환합니다.
따라서 'hello'에서 'h.+l'을 매칭하려 한다면, 'hel' 대신 'hell'을 매칭합니다.
이러한 특성을 막기 위해서는 'lazy'하게 만들어주면 됩니다. ?(물음표) 표시를 추가하여, 'lazy'하게, 즉 가장 짧은 문자열을 반환하도록 만들어줍니다. 그렇지만 이 경우 'hel'만을 반환합니다.
2. 가장 첫 매칭 문자열을 반환한다
이는 기본적으로 패턴을 만족하는 단 하나의 경우만 매칭하여 반환하기 때문입니다. match(), search()는 모두 하나의 경우만 반환합니다.
모든 경우를 다 얻고 싶을 때는 findall(), finditer()를 사용하면 됩니다.
그런데 'helhelhel'에서 'hel'을 찾는 경우, 세 번 모두 매칭이 되지만, 'hhhhhhhhh'에서 'hhh'를 찾는 경우, 7번 매칭이 되지 않고 3번만 매칭이 됩니다.
3. 'consume'한다
: 전체 문자열 중, 해당 패턴을 만족하는 문자열을 찾으면, 그 부분은 이후 탐색에서 배제됩니다.
그렇다면, 패턴이 겹치는 경우에도 매칭을 하고 싶을 땐 어떻게 해야 할까요? 'consume'하지 않도록 만들면 됩니다. 전방탐색(lookahead assertion)을 사용합니다.
python - How to find overlapping matches with a regexp? - Stack Overflow
보통 전방탐색을 이용할 때, '문자열(?=패턴)'과 같은 형태로 사용합니다. '문자열'이 포함되어있고, 그 전방(오른쪽)에 바로 '패턴'이 붙어 있는 경우, '문자열'만을 반환하도록 만든 것입니다.
여기서 우리는 '문자열'부분을 생략하고, '(?=패턴)'의 형태로 사용할 것입니다. 반환되는 것은 길이가 0인 문자열이기 때문에, consume되는 문자열이 없이 그 다음으로 넘어갑니다.
'Computer > python' 카테고리의 다른 글
[python] 가상환경(Ubuntu)에서 matplotlib 한글폰트 사용하기 (0) | 2021.11.04 |
---|---|
[python] groupby 이중 사용시 컬럼의 모든 변수값 포함하는 법 (0) | 2021.10.28 |
[Folium] Choropleth 지도 전부 검은색으로 뜰 때 해결법 + 미국 zip code별 GeoJSON 자료 (0) | 2021.09.21 |
[파이썬 오류] "TypeError 'xxx' object is not callable" 무슨 뜻? (0) | 2021.09.13 |
[백준] 10952 : while(1) 무한반복문 사용하기 (0) | 2021.09.12 |
댓글