알고리즘을 풀면서 자주 봤었던 regex... regex만 잘써도 내 알고리즘의 길이가 절반쯤은 줄어들 것 같고, 아직 풀지 못한 문제도 접근이 가능할 것 같다. 두려워 하지말고 천천히 정리해보자🥲
regex는 정규표현식(Regular Expression)으로 복잡한 문자열을 처리할때 사용한다. 파이썬에만 존재하는 고유 문법이 아닌, 문자열을 처리하는 모든 곳에서 사용할 수 있다.
파이썬에서 정규표현식을 사용하기 위해서는 re모듈을 사용한다.
메타 문자는 정규식에서 특별한 의미를 지니는 영문자가 아닌 문자다.
메타문자 | 설명 | 예제 |
---|---|---|
* | 문자 또는 숫자가 0개 이상 나타남을 의미한다 | goo* == godness, goodness / != gdness |
+ | 문자가 1개 이상 나타남을 의미한다. | goo+ == godness, gooodness / != godnesss |
? | ? 앞에 있는 문자또는 그룹과 0개 또는 1개 일치한다 | 12?3 == 123, 13 |
$ | 문자열의 끝을 일치시킨다 | end$ == the end / != the ending |
^ | 문자열의 시작을 일치시킨다 | ^serverity == serverity level / != The serverity level |
. | 단일 문자를 일치시킨다 | b.at == baat, bBat / != bB4at |
() | 소괄호 내의 문자를 문자 패턴으로 간주해야함을 나타낸다 | A(boo)+Z == AbooZ, AboobooZ / != AboZ, AboooZ |
| | 파이프 왼쪽 또는 오른쪽 문자 중 하나를 일치시킨다 | A(B|C)D == ABD, ACD / != AD, ABCD |
\ | 뒤에 오는 메타문자를 일반 문자로 간주해야함을 나타낸다 | \ == / \? == ? |
{m, } | m개 이상의 선행하는 인스턴스를 일치시킨다 | Z{2,} == ZZ, ZZZ |
{m} | 정확히 m개의 선행하는 인스턴스를 일치시킨다 | z{2} == zz / != zzz |
참고
IBM | 메타 문자
해당 메타 문자에 물음표(?)를 추가하여 최소 또는 비탐욕으로 설정할 수 있다.
탐욕적 수량자 : 가능한한 가장 큰 덩어리를 찾는다
비탐욕적 수량자 : 가장 근접한 최소의 덩어리를 찾는다
탐욕적 수량자 | 비탐욕적수량자 |
---|---|
* | *? |
+ | +? |
{n,} | {n,}? |
대괄호 표현식은 단일 문자나 조합 요소와 일치시키는데 사용할 수 있다.
표현식 | 설명 | 예제 |
---|---|---|
[abcd] | 대괄호로 묶인 문자를 일치시킨다. | [nN][oO] == no, nO, No, No / gr[ae]y == gray, grey |
[a-d] | 하이픈으로 구분 된 문자 범위의 모든 문자를 일치시킨다 | [0-9] : 10진수 숫자 / [ab3-5] : a,b,3,4,5 |
[^abcd][^a-d] | 대괄호로 묶인 문자나 하이픈으로 구분된 문자 범위 밖의 문자를 일치시킨다 | [^0-9] : 숫자가 포함되지 않은 문자열을 일치시킨다 |
[.ab.] | 다중 문자 조합 요소를 일치시킨다 | [.ch.]는 다중 문자 조합 시퀀스 ch와 일치한다. |
[=a=] | 요소 자체를 포함하여 해당 요소와 기본 정렬 순서가 동일한 모든 조합요소를 일치시킨다. | [=e=] e및 현재 로케일에 있는 모든 e의 변형을 일치시킨다. |
\(백슬래시)뒤에 문자가 숫자가 오는 조합을 이스케이프 시퀀스라고 한다
이스케이프 시퀀스 | 설명 |
---|---|
\\ | 백슬래시, \ |
\' | 작은 따옴표, single quote, ' |
\" | 큰 따옴표, double quote, " |
\a | 벨, ASCII Bell, BEL |
\b | 백스페이스, ASCII Backspace, BS |
\f | 폼피드, ASCII Formfeed, FF |
\n | 새 줄, 개행 문자, ASCII Linefeed, LF |
\r | 캐리지 리턴, ASCII Carrage Return, CR |
\t | 가로 탭, ASCII Horizontal Tab, TAB |
\ooo | \뒤에 8진수 숫자를 지정하여 ASCII 코드의 문자 표현 ex) \141 == 'a' |
\xhh | \뒤에 16진수 숫자를 지정하여 ASCII 코드의 문자 표현 ex) \x61 == 'a' |
\N{name} | {} 안에 문자 이름을 지정하여 유니코드 문자 표현 ex) \N{LINE FEED |
\uxxxx | \뒤에 16비트 16진수 숫자를 지정하여 유니코드의 문자 표현 ex) \u0061 == 'a' |
\Uxxxxxxxx | \뒤에 32비트 16진수 숫자를 지정하여 유니코드의 문자 표현 ex) \U00000061 == 'a' |
\< | 영숫자가 아닌 문자와 영숫자(밑줄 포함) 간의 경계로 정의된 단어의 시작 또는 ID의 시작을 일치시킨다. 문자가 아니라 컨텍스트를 일치시킨다 |
\b | 단어 경계를 일치시킨다. 영숫자 시퀀스의 시작이나 끝에 있는 빈문자열을 일치시킨다. 전체 단어만 검색을 사용한다 |
\B | 단어가 아닌 경계를 일치시킨다. 단어의 시작이나 끝에 있는 빈 문자열을 일치시킨다 |
\d | 10진수를 일치시킨다 == [0-9], [[:digit:]] |
\D | 10진수가 아닌 문자를 일치시킨다. == [^0-9], [^[:digit:]] |
\s | 공백 문자를 일치시킨다 == [ \t\n\r\f\v], [[:space:]] |
\S | 공백이 아닌 문자를 일치시킨다 == [^ \t\n\r\f\v], [^[:space:]] |
\w | 영숫자가 아닌 문자를 일치시킨다 == [^a-zA-Z0-9_], [^[:alnum:]_] |
\[1-9] | 0이 아닌 단일 10진수 숫자 n이 뒤에 오는 \를 후면 참조라고 한다. n번째 괄호로 묶인 부속 표현식으로 일치된 동일한 문자세트를 일치시킨다 |