알고리즘 연습 사이트에서 문제를 풀고 나서 다른 분들의 코드를 보면 난데없이 외계어가 적혀있는 경우가 있다.
그리고 그런 경우에는 대개 코드가 짧고 간결한데, 바로 정규표현식을 사용한 것이다.
정규표현식?
- 정규표현식은 복잡한 문자열을 처리하는데 사용하는 기법이다.
- 문자열을 처리하는 모든 언어에서 사용이 가능하다.
- 어렵지만 알면 편리하다.
어디에 쓰나?
점프 투 파이썬에 나오는 예제를 인용하고자 한다.
주민등록번호를 포함하고 있는 텍스트가 있다. 이 텍스트에 포함된 모든 주민등록번호의 뒷자리를
*
문자로 변경하시오.
이 문제를 정규표현식 없이 풀 경우, 다음과 같은 순서로 프로그램을 작성해야할 것이다.
- split을 이용해서 전체 텍스트를 공백 문자로 나눈다.
- 나눠진 단어들이 주민등록번호 형식인지 조사한다.
- 단어가 주민등록번호 형식이라면 뒷자리를
*
로 바꾼다. - 나눠진 단어들을 다시 조립한다.
data = """
park 800905-1049118
kim 700905-1059119
"""
result = []
for line in data.split("\n"):
word_result = []
for word in line.split(" "):
if len(word) == 14 and word[:6].isdigit() and word[:7].is digit():
word = word[:6] + '-' + '*******'
word_result.append(word)
result.append(" ".join(word_result))
print('\n'.join(result))
하지만 정규표현식을 사용한다면 아주 간결하게 코드를 작성할 수 있다.
import re
data = """
park 800905-1049118
kim 700905-1059119
"""
pat = re.compile("(\d{6})[-]\d{7}")
print(pat.sub('\g<1>-*******', data))
만약 찾고자 하는 문자열이나 바꿔야 할 문자열의 규칙이 더욱 복잡하다면 정규표현식은 더욱 강력한 힘을 발휘한다.
메타 문자
메타 문자: 원래의 뜻이 아닌, 특별한 용도로 쓰이는 문자.
메타 문자의 종류: . ^ $ * + ? {} [] ₩ | ()
문자 클래스 [ ]
[ ]
는[ ]
안에 들어 있는 문자들과 매치 여부를 판단한다.- 정규 표현식이
[abc]
라면 이 표현식의 의미는 ‘a,b,c,중 한 개의 문자든 매치하는 지’를 의미한다. [ ]
안에-
이 들어간다면-
는 두 문자 사이의 범위를 의미한다.[abc]
는[a-c]
로 표현이 가능한 것이다.
문자클래스 []
안에서의 ^
^
는 반대의 의미를 가진다.- 앞서 봤던
[ ]
와-
로 [0-9]라는 표현식을 만들면, 모든 숫자를 의미하는데, 앞에^
을 붙여[^0-9]
로 만든다면, 숫자가 아닌 모든 것을 의미하게 되는 것이다.
메타 문자 ^
, $
^
가 문자클래스 외부에 있을 때는 반대의 의미가 아닌, 문자열의 처음을 의미한다.$
는 문자열의 마지막을 의미한다.- 이는 추후 컴파일 옵션을 다룰 때 더 자세히 살펴보겠다.
메타 문자 .
.
은 줄바꿈 문자\n
을 제외한 모든 문자와 매치된다.a.b
는a + 어떤 문자 + b
와 같은 것이다.- 예를 들어,
a.b
는abb
,a0b
등과 매치되는 것이다. .
이[]
안에서 사용된다면, 문자.
을 의미한다.
메타 문자 *
, +
, {}
*
은 문자 반복을 의미한다.- 반복 횟수는 0~무한대다. 그 문자가 없어도 되는 것이다.
-
a*b
라 하면,b
,aab
,aaaaaaaaab
등과 매치된다. +
역시 문자 반복을 의미한다.- 단, 반복 횟수가 1~무한대다. 해당문자가 존재해야 한다.
-
a+b
라 하면,ab
,aaaaaab
등이 매치된다. 하지만b
는 매치되지 않는다. {m,n}
을 이용해서 반복횟수가 m부터 n개 까지인 반복을 표현할 수 있다.{m,n}
을 사용하여 m개부터 n개까지로 제한할 수 있다.a{2}b
라 하면a
가 정확히 2번 반복되는aab
와 매치가 된다.a{2,5}b
라 하면,a
가 2번에서 5번까지 반복될 수 있는 것이다.
메타문자 ?
?
는 {0,1}을 의미한다.a?b
라 하면,a
가 있어도 되고 없어도 된다는 의미이기에,b
와도 매치가 되고ab
와도 매치가 된다.
자주 사용하는 문자 클래스
\d
- 숫자와 매치[0-9]
와 같다.\D
- 숫자가 아닌 것과 매치[^0-9]
와 같다.\s
- 공백 문자와 매치[\t\n\r\f\v]
와 같다.\S
- 공백 문자가 아닌 것과 매치[^\t\n\r\f\v]
\w
- 문자 + 숫자와 매치[a-zA-Z0-9]
와 같다.\W
- 문자 + 숫자가 아닌 것과 매치[^a-zA-Z0-9]
와 같다.
다음에는 이러한 메타문자를 사용한 정규 표현식을 어떻게 사용하지는 알아보겠다.