정규표현식 (Regular Expressions)
특정한 패턴에 일치하는 복잡한 문자열을 처리할 때 사용하는 기법.
파이썬에서는 표준 모듈 re
를 사용해서 사용할 수 있다.
imoort re
result = re.match('Ex', 'Expressions')
match
의 첫번째 인자에는 패턴이 들어가고, 두번째 인자에는 문자열 소스가 들어간다.
match()
는 소스와 패턴의 일치 여부를 확인하고, 일치할 경우 Match object
를 반환한다.
Cheatsheet
Character classes
특정 셋의 문자와 일치
class | expr | description | ex |
---|---|---|---|
dot | . | 줄 바꿈을 제외한 모든 문자와 일치 | |
match any | /s /S | 줄 바꿈을 포함하여 모든 문자를 일치 | |
word | \w | 모든 단어 문자 (영숫자 및 밑줄)와 일치 [A-Za-z0-9_] 와 동일 |
|
not word | \W | 단어 문자가 아닌 문자 (영숫자 및 밑줄)와 일치 [^ A-Za-z0-9_] 와 동일 |
|
digit | \d | 임의의 숫자 (0-9)와 일치 [0-9]와 동일 |
|
not digit | \D | 숫자가 아닌 문자와 일치 [^0-9]와 동일 |
|
whitespace | \s | 공백 문자(공백, 탭, 줄바꿈)와 일치 | |
not whitespace | \S | 공백 문자(공백, 탭, 줄바꿈)가 아닌 문자와 일치 | |
character set | [ABC] | 셋의 모든 문자와 일치 | |
negated set | [^ABC] | 셋에 없는 모든 문자와 일치 |
Anchors
문자가 아닌 문자열 내의 위치
class | expr | description | ex |
---|---|---|---|
beginning | ^ | multiline flag(m)가 활성화 된 경우 문자열의 시작 또는 행의 시작과 일치 문자가 아닌 위치와 일치 |
|
end | $ |
multiline flag(m)가 활성화 된 경우 문자열의 끝 또는 행의 끝과 일치 문자가 아닌 위치와 일치 |
|
word boundary | \b | 공백, 구두점 또는 문자열의 시작/끝과 같은 단어 경계 위치를 찾음 문자가 아닌 위치와 일치 |
|
not word boundary | \B | 단어 경계다 아닌 위치와 일치 문자가 아닌 위치와 일치 |
Escaped characters
일부 문자는 정규 표현식에서 특별한 의미를 지니며 이스케이프해야 합니다.
class | expr | description | ex |
---|---|---|---|
octal escape | \000 | 8진수는 \000 형식의 문자를 이스케이프 처리 255(\377)보다 작아야함 |
|
hexadecimal escape | \xFF | \xFF 형식의 16진수 이스케이프 문자 | |
unicode escape | \uFFFF | 유니코드 \uFFFF 형식의 문자를 이스케이프 처리 | |
control character escape | \cI | \cZ 형식의 제어 문자를 이스케이프 처리 \cA(NULL, char code 0)에서 \cZ(EM, char code 25)까지 다양 |
|
tab | \t | TAB 문자(char code 9)와 일치 | |
line feed | \n | LINE FEED 문자(char code 10)와 일치 | |
vertical tab | \v | VERTICAL TAB 문자(char code 11)와 일치 | |
form feed | \f | FORM FEED 문자(char code 12)와 일치 | |
carrige return | \r | CARRIAGE RETURN 문자(char code 13)와 일치 | |
null | \0 | NULL 문자(char code 0)와 일치 |
Groups & Lookaround
그룹을 사용하면 일련의 토큰을 결합하여 함께 작동할 수 있음
캡쳐 그룹은 역 참조로 참조되고 결과에서 별도로 엑서스 할 수 있음
둘러보기를 사용하면 그룹을 결과에 포함하지 않고 일치시킬 수 있음
class | expr | description | |
---|---|---|---|
capturing group | (ABC) | 여러 토큰을 그룹화하고 하위 문자열을 추출하거나 역참조를 사용하는 캡처드룹을 만듬 | |
backreference | \1 | 이전 캡쳐 그룹의 결과와 일치 예를 들어 \1 은 첫번째, \3은 세번째 캡쳐 그룹과 일치 |
|
non-capturing group | (?:ABC) | 캡쳐 그룹을 만들지 않고 여러 토큰을 그룹화 함 | |
positive lookahead | (?=ABC) | 그룹을 주 표현식 다음에 일치시키지 않고 결과에 포함 | |
negative looahead | (?!ABC) | 주 표현식 뒤에 일치 할 수 없는 그룹을 지정 (일치하는 경우 결과가 무시) |
|
positive lookahead* | (?<=ABC) | 결과에 포함시키지 않고 주 표현식 앞에 그룹을 일치 JavaScript는 지원 안됨 |
|
negative lookahead* | (?<!ABC) | 주 표현식 앞에 일치시킬 수 없는 그룹을 지정 (일치하는 경우 결과가 무시) JavaScript는 지원 안됨 |
Quantifiers & Alternation
Quantifiers는 선행하는 토큰이 일정 횟수 일치해야 함
기본적으로 최대한 많은 문자와 일치
Alternation는 하나의 순서 또는 다른 것과 부합하는 boolean OR과 같은 역할을 함
class | expr | description | ex |
---|---|---|---|
plus | + | 앞의 토큰 중 하나 이상과 일치 | |
star | * | 앞의 토큰 중 0개 이상을 찾음 | |
quantifier | {1,3} | 이전 토큰의 지정된 수량과 일치 {3}은 정확히 3개 일치해야함 {3,}은 3개 이상과 일치 |
|
optional | ? | 앞의 토큰 중 0 또는 1과 일치하므로 효과적으로 선택적으로 만듬 | |
lazy | ? | 앞에 있는 한정 기호를 게으르게 만들어서 가능한한 적은 수의 문자와 일치시킴 기본적으로 한정기호는 최대한 많은 문자와 일치 |
|
alternation | | |
boolean OR과 같은 역할을 함| 앞 뒤에 있는 표현식을 일치그룹내에서 또는 전체 표현식에서 작동할 수 있음 패턴은 순서대로 테스트됨 |
Substitution
이 토큰은 대체 문자열에서 일치 항목의 다른 부분을 삽입하는데 사용
class | expr | description |
---|---|---|
match | $& | 일치하는 텍스트를 삽입 |
capture group | $1 | 지정된 캡처 그룹의 결과를 삽입 (ex. $3은 세번째 캡처 그룹을 삽입) |
before match | $` | 일치하는 원본 문자열의 일부를 삽입 |
after match | $’ | 일치하는 문자열 다음에 오는 부분을 삽입 |
escaped $ | $$ | 달러 문자($)를 삽입 |
escaped characters | \n | 대체 문자열에는 \n, \t, \x09, \u0009 와 같은 JS 문자열 형식과 호환되는 이스케이프 된 문자가 지원됨 |
Flags
표현식 플래그는 표현식 해석 방법을 변경함
JS에는 세 개의 플래그가 있음.
class|expr|description
—|—|—
ignore case|i|전체 표현식을 대소 문자를 구별하지 않게 함
\aBc\i는 AbC와 일치함
global search|g|마지막 일치 항목의 색인을 유지하면 이후 검색이 이전 일치 항목의 끝에서부터 시작될 수 있음
전역 플래그가 없으면 후속 검색에서 동일한 일치 항목을 반환
multiline|m|multiline 플래그가 활성화괴면 시작 및 끝 앵커(^ 및 $)는 전체 문자열의 시작 및 끝 대신 줄의 시작 및 끝과 일치
/^[\s\S]+$/m과 같은 패턴은 앵커가 모든 라인의 시작/끝과 일치하기 때문에 여러 줄에 걸쳐있는 일치를 반환 할 수 있습니다.
Examples
integer & decimal numbers
test testing
phone numbers
word
24 or 32 bit colors
4 letter words
2-5 letter palindromes
정규식 공부하기 좋은 사이트
Let me know what you think of this article in the comment section below!