[파이썬/python] 정규표현식(regex) 공부

https://school.programmers.co.kr/learn/courses/11/11-%EC%A0%95%EA%B7%9C%ED%91%9C%ED%98%84%EC%8B%9D

(코드스테이츠 강의 링크)

 

프로그래머스에 정규표현식에 관한 무료강의가 있길래 공부해 보았다.

이전에 자바스크립트로 한번 공부한 적이 있지만, 쓴 지 오래되어 많이 까먹었고.. 파이썬은 공부해 본 적이 없었기 때문에 이 강의로 공부해 보면 좋을 것 같았다.

짧고 간단하면서도 핵심만 들어 있는 강의라 짧은 시간에 정규표현식에 대한 감을 익히는 데에 좋았다.

동영상 강의가 아닌, 설명을 읽고 빈칸에 직접 정규표현식을 입력하며 공부하는 강의이다.

 

강의는 이런 식으로 되어 있으며,

import re는 정규표현식에 관한 파이썬 내장 모듈이다.

findall은 이 내장 모듈의 함수이며, 이름처럼 정규표현식과 일치하는 부분을 모두 찾아 리스트로 반환해 준다.

더 자세히 공부: https://wikidocs.net/4308

https://brownbears.tistory.com/506

 

 

 

 

간단요약
\d : 숫자 대표 정규 표현식
\w : 글자 대표 정규 표현식
\s : 공백 문자 (스페이스, 탭, 뉴라인)
\S : 공백을 제외한 문자
\D : 숫자를 제외한 문자
\W : 글자 대표 문자를 제외한 글자들(특수문자, 공백 등)
+ : 1개 이상의 연속된 문자,숫자를 찾고 싶을 때
* : 0개 이상의 연속된 문자,숫자를 찾고 싶을 때
? : 있거나 없다
ex) - [- ]? :  -이나 공백이 있거나 없다
{n}: n번 반복
{n,m} : n에서 m까지 반복
[ ] : 괄호 안의 있는 문자들을 선택
[a-z] : a~z까지의 소문자 선택
[가-힣] : 한글 문자 모두  선택



\d

\d는 숫자를 대표하는 정규표현식이며, d는 digit을 뜻한다.

 

 

결과:

숫자만 출력되는 것을 볼 수 있다.

 

 


\w

\w는 글자를 대표하는 정규표현식이다.

1,2,3, 가, 나, 다, a, b, c와 같은 문자를 포함한다.

특수문자는 포함하지 않지만 _(언더스코어)는 포함한다!

 

결과:

"\n". join() 형식이라 매우 길어져서 다 캡쳐할 수 없지만 아무튼 공백이랑  _를 제외한 특수문자 빼고 모든 문자들이 출력되었다.

 

 

그 밖의 대표 문자

\s : 공백 문자 (스페이스, 탭, 뉴라인)

\S : 공백을 제외한 문자

\D : 숫자를 제외한 문자

\W : 글자 대표 문자를 제외한 글자들(특수문자, 공백 등)

 

 


+

\d는 숫자를 한 글자만 찾는다. (예를 들어서 010-123-1234가 있으면 010,123,1234가 아닌 0,1,0,1,2,3,1,2,3,4)

한 개 이상의 연결된 숫자를 찾고 싶을 때는 뒤에 +를 붙여주면 된다.

\w도 마찬가지로 연속된 문자열을 찾고 싶으면 \w+와 같은 형태로 작성하면 된다.

 

결과:

 


 

*

정규표현식으로 자연수만 찾으려면 어떻게 해야 할까?

자연수는 반드시 첫자리가 1~9의 숫자여야 하고, 그 뒤에는 0~9가 올 수도, 안 올 수도 있다.

즉, 처음에 1~9중 하나의 숫자가 오고 뒤에는 숫자가 0개 이상 와야 한다.

*은 0개 이상이라는 뜻이며,

이를 이용하여 자연수를 구하려면 [1-9]\d* 와 같이 쓸 수 있다.

결과:

 


 

?

전화번호는 010-1234-1234나 01012341234와 같은 형태로 나타낼 수 있다.

전화번호 사이에 하이픈(-)이 있거나 없어도 찾게 하려면

\d+-?\d+-?\d+ 와 같은 형태로 입력하면 된다.

즉, -? 는 "-가 있거나 없다"를 의미.

결과:

 

전화번호 사이에 - 가 있는 전화번호가 출력되었는데, 사이에 공백이 있는 전화번호는 '010', '2545', '3457'과 같이 끊어져 출력되었다.

이것을 해결하려면 어떻게 해야 할까?

 

- 또는 공백이 있거나 없다의  형태로 써야 할 것이다.

 

이것은

[- ]? 의 형태로 적어 줄 수 있다.

 

\d+[- ]?\d+[- ]?\d+ 와 같은 형태로 적는다.

결과:

근데 내가 실수로 ?를 괄호 안에 같이 넣었는데 값이 잘 출력되는 걸 보면 괄호 안에다가 넣어도 되나 보다...?

 


 

{숫자} & {숫자1,숫자2}

 

근데 \d+[- ]?\d+[- ]?\d+는 또 한계가 있다.

"012981-323-4189047103"같은 형태도 전화번호라고 인식하기 때문이다.

 

이것을 해결하기 위해 {숫자}를 사용한다.

{숫자} "숫자번 반복한다"라는 뜻이다.

즉, \d{2}는 숫자가 연속 두 번 나온다는 뜻이다.

전화번호의 각 자릿수에 맞게 출력되게 하려면 \d{2}[- ]?\d{3}[- ]?\d{4} 와 같은 형태로 적어 주면 된다.

 

결과:

 

근데 070-9999-9999나 010 2454 3457 같은 정상적인 전화번호도 출력되지 않았다.

전화번호의 자릿수는

처음:2~3자리 

가운데: 3~4자리

마지막: 4자리

와 같다.

 

이것을 해결해 주려면

{숫자1,숫자2} 과 같은 형태로 쓰면 된다.

{숫자1,숫자2}은 숫자 1부터 숫자 2까지 반복한다는 뜻이다.

모든 정상적인 전화번호가 출력되게 하기 위해 \d{2,3}[- ]?\d{3,4}[- ]?\d{3,4} 처럼 입력해 준다.

 

결과:

 

 


 

[], [a-z], [가-힣]

 

우리가 앞서 -와 공백이 있을 수도 없을 수도 있는 경우에 [- ]?와 같은 형태로 썼다.

대괄호 안에 글자를 넣으면 해당 글자를 모두 선택할 수 있다.

알파벳 소문자 모음만 찾고 싶다면, [aeiou]와 같이 입력하면 된다.

 

결과:

소문자 모음만 출력되는 것을 확인할 수 있다.

 

그러면 소문자 알파벳을 모두 찾고 싶다면?

[abcdefghijklmnopqrstuvwxyz]와 같이 입력하면 된다. 하지만 더 간단하고 효율적인 방법이 있다.

[a-z]의 형식으로 입력하면 된다.

우리가 앞서 자연수만 찾을 때도, [1-9]\d*처럼 썼었다.

한글도 마찬가지로, [가-힣]과 같은 형태로 입력하면 한글을 모두 출력할 수 있다. (*단, 이 방식으로 ㅏㅑㅓㅕ나 ㄱㄴㄷㄹ 같은 낱글자는 찾을 수 없다.)

 

결과:

소문자들만 쭈우욱 출력된다.

 

 

연속된 영어 소문자를 찾고 싶다면, [a-z]+처럼 입력하면 된다.

한글도 마찬가지로 [가-힣]+으로 입력해 준다.

 

결과:

 

 

 

끝!

 

 

comment