Study Alone
정규표현식 요약 본문
정규표현식은 거의 모든 언어에서 쓰이는 형식언어로써 문자열의 검색과 치환을 지원한다.
위키피디아의 정규표현식 페이지를 통해 더 자세한 내용을 알 수 있다.
여기서는 try helloworld코스에서 학습한 내용을 정리한다.
이 과정에서 사용되는 예제는 파이썬으로 구현되어 있으며 아래와 같다.
아래에서 regex 변수에 정규표현식을 설정한 후 실행하면 결과가 줄단위로 출력된다.
regex = r'\d'
search_target = 'Luke Skywarker 02-123-4567 luke@daum.net
다스베이더 070-9999-9999 darth_vader@gmail.com
princess leia 010 2454 3457 leia@gmail.com'
import re
result = re.findall(regex, search_target)
print("\n".join(result))
숫자 대표 문자 (\d)
\d
는 숫자를 대표하는 정규표현식으로 digit를 줄여서 표시한다.
파이썬으로 아래 코드를 실행해보면 문자열에 포함된 숫자들이 한 줄씩 출력된다.
글자 대표 문자 (\w)
글자 대표 문자 \w
는 ‘abc’나 ‘가나다’와 같은 글자를 대표하는 문자이다. 특수문자는 포함하지 않지만 ‘_’는 포함한다.
하나이상 (+)
\d
를 이용하면 모든 숫자를 한글자씩 찾아준다. 만약 9999와 같이 연결된 숫자를 한번에 찾고 싶다면 어떻게 해야할까?
이어진 형태의 숫자를 표현하고 싶다면 \d+
와 같이 대표문자 뒤에 +를 붙이면 된다.
+
는 하나 혹은 그 이상이 연결된 이라는 뜻이다.
0개 이상(*)
자연수를 정규식으로 어떻게 표현해야할까? 자연수의 첫자리는 반드시 1에서 9사이의 숫자여야 한다. 010과 같은 자연수는 존재하지 않기 때문이다. 즉 자연수는 1에서 9 사이의 숫자 중 하나가 나온 후 0개 이상의 숫자가 연결된 숫자라고 할 수 있다.
이것을 정규표현식으로는 [1-9]\d*
로 나타낼 수 있다.
0개 이상은
*
로 표현하는데 숫자가 0개 이상나타난다는 것은\d*
, 문자가 0개 이상이라는 것은\w*
으로 나타낼 수 있다.
있거나 없거나 (?)
?
는 있거나 없거나를 의미한다. 전화번호를 찾을 때, 중간의 -문자는 있을 수도, 없을 수도 있다.
즉 다음의 경우 모두 유효한 전화번호라고 할 수 있다.
021234567
02-123-4567
전화번호는 3개의 연속된 숫자 그룹으로 구분되고 그 사이에 -이 있거나 없는 것은 -?
와 같이 표현할 수 있다. 따라서 이를 조합하면 다음과 같이 표현할 수 있다.
\d+-?\d+-?\d+
그런데 위와 같이 표현할 경우 숫자 그룹 사이에 공백이 있는 경우는 표현할 수 없다.
그래서 조건을 -가 있거나 없다 보다는 - 또는 공백이 있거나 없다로 하는게 더 좋다.
- 또는 공백이 있거나 없다라는 조건은 아래와 같이 표현할 수 있다.
\d+[- ]?\d+[- ]?\d+
n번 반복
위에서 설정한 조건대로면 숫자 그룹의 자릿수까지는 정의할 수 없다.
그래서 0030589-5-95826 과 같은 이상한 숫자 그룹도 전화번호로 인식해버린다.
중괄호를 사용하고 그 안에 숫자를 지정하면 정확히 몇번 반복해서 나타내야 하는지를 지정할 수 있다.
예를 들어 \d{2}
라고 하면 정확히 2번의 숫자가 나타나는 걸 의미한다.
일반적인 전화번호 스타일 00-000-0000 와 같은 형태는 다음과 같이 표현할 수 있다.
\d{2}[- ]?\d{3}[- ]?\d{4}
n~m번 반복
위 표현식에서 \d{2}는 숫자가 정확히 2번 반복된다는 것을 의미한다. 그런데 전화번호에서 첫번째 그룹은 2자리일 수도 있고 3자리일수도 있다. 또한 두번째 그룹은 3자리일수도 있고 4자리일수도 있다.
숫자가 2~3번 반복되는 것은 \d{2,3}
와 같이 표현할 수 있다. 위의 조건을 표현식으로 나타내면 다음과 같다.
\d{2,3}[- ]?\d{3,4}?\d{4}
몇개중에 고르기
영어 알파벳 중에 소문자 모음(a,e,i,o,u)만 골라서 보고 싶을 때는 어떻게 해야할까?
그런 경우에는 [a,e,i,o,u]
라고 적어주면 된다.
정규표현식의 대괄호[] 안에 글자를 넣으면 텍스트에 나오는 해당 글자들은 모두 선택된다.
범위에서 고르기
영어소문자만 고르고 싶다면 대괄호안에 모든 영어 소문자를 적어줄 수도 있지만 [a-z]
와 같이 범위만 지정해 줘도 된다.
이렇게 쓰면 a부터 z사이에 있는 글자를 모두 선택하라는 의미이다.
연속된 영어소문자를 선택하고 싶다면 [a-z]
에 반복을 의미하는 +
를 붙여서 [a-z]+
로 표현하면 된다.
한글 고르기
한글의 첫번째 글자는 가이고 마지막 글자는 힣이다.
그래서 [가-힣]
표현식은 모든 한글을 선택하게 된다. 단 ㄱ
, ㄴ
, ㄷ
, ㅏ
, ㅣ
, ㅗ
와 같은 낱글자들은 포함되지 않는다.
역시나 연속된 한글을 선택하고 싶다면 [가-힣]+
로 표현할 수 있다.
기타 대표문자
- \s : 공백문자 (스페이스, 탭, 뉴라인)
- \S : 공백문자를 제외한 문자
- \D : 숫자를 제외한 문자
- \W : 글자 대표문자를 제외한 문자들 (특수문자, 공백 등)
'Programming > Common' 카테고리의 다른 글
(6급) Linked Lists - Length & Count with Python (0) | 2016.08.18 |
---|