Python
[파이썬] 정규표현식 정리
밀깜
2022. 6. 20. 21:38
1. 도입
프로젝트를 진행할 때 파이썬 웹 크롤링을 진행하였다. 당시 문자열을 직접 parsing하는 코드를 작성하였는데, 생각해보니 그게 가능했던 이유는 HTML 태그를 분석해서 필요한 데이터만 뽑아올 수 있었기 때문이다.
만약 긴 텍스트 데이터에서 원하는 형식의 데이터만 가져오려면 좀 더 효율적인 방법이 필요하다는 생각이 들었다. 덕분에 미루고 있던 정규표현식을 공부하게 되었다.
2. 메타 문자 사용하기
문자 | 의미 | 예시 | 예시 매칭 |
^ | 문자열 시작 | ^he | "hello world", "hell", "heck" |
$ | 문자열 끝 | you$ | "nice to meet you" |
| | or | ^CSS | awesome$ | "CSS is awesome" "Javascript is awesome" |
[] | 문자 클래스 (여러 조건 나타내기) |
[\d] [^\d] [0-5] |
"The score is 95" "The score is 95" "9876543210" |
\d | 숫자 | "\d" | "1st place", "no.2" |
\D | 숫자를 제외한 모든 문자 | "\D" | "1st place", "no.2" |
\w | 알파벳 대소문자, 숫자, 밑줄(_) | "\w-\d" | "A-9", "_-8" |
\W | \w를 제외한 모든 문자 | "\W\w" | "%p" |
\s | 공백, 탭, 개행 문자 | "\s" | "hello !!" => " " |
\S | \s를 제외한 모든 문자 | "\S" | "hi !!" => "h", "i", "!", "!" |
\n | 개행 문자 | ||
\ | 이스케이프 | ||
. | 모든 문자 | "d.g" | "dog", "deg", "dug" |
(?i) | 대소문자 무시 | "(?i)python" | "PYTHON", "Python" |
3. 수량자 사용하기
수량자 | 의미 ('*' 앞의 문자가) |
예시 | 예시 매칭 |
* | 0개 이상 | hell* | hel, hell, hellll |
+ | 1개 이상 | hell+ | hell, helll, helllll |
? | 0 또는 1개 | apple? | appl, apple |
{n} | n개 | \D{5} | apple, bonus, chair |
{n,m} * 공백 금지 |
n개 이상, m개 이하 | \d{3,5}[_]\w{3,5} | 123_qwe, 33333_apple |
{n,} | n개 이상 | [a-z]{2} | hi, oh, ha, am |
- 물음표를 제외한 수량자 바로 뒤에 물음표를 붙이면, 정규표현식을 만족하는 최소 단위 마다 검색할 수 있다
- 아래 문장에서 차이를 살펴보도록 하자(https://regexr.com/)
<RegExr> was created by <gskinner.com>, and is proudly hosted by <Media Temple.>
- '<.*>'으로 검색하는 경우: <RegExr> was created by <gskinner.com>, and is proudly hosted by <Media Temple.>
- '<.*?>'으로 검색하는 경우: <RegExr> was created by <gskinner.com>, and is proudly hosted by <Media Temple.>
4. 그룹으로 묶기
- 괄호 안에 하나로 묶을 '패턴'을 추가하고 필요하면 '|' 등을 사용한다. 수량자 등을 붙여서 활용할 수도 있다.
예시 패턴 | 예시 매칭 |
(?:land|ocean)_animals | land_animals, ocean_animals |
(A|B|C)(+|0|-) | A+, B+, C-, B0, B+ |
(boo~){3,} | boo~boo~boo~, boo~boo~boo~boo~ |