Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

Study Alone

정규표현식 요약 본문

Programming/Common

정규표현식 요약

GRootC 2016. 8. 18. 13:22
Hello!

정규표현식은 거의 모든 언어에서 쓰이는 형식언어로써 문자열의 검색과 치환을 지원한다.

위키피디아의 정규표현식 페이지를 통해 더 자세한 내용을 알 수 있다.

여기서는 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