Python 강좌 : 제 44강 - 정규 표현식
정규표현식(Regular Expression)
정규 표현식(Regular Expression)
은 프로그래밍에서 사용하는 형식 언어입니다.
특정한 규칙을 가진 문자열을 검색
, 분리
, 치환
하는 데 주로 활용되며, 특정한 패턴과 일치하는 텍스트를 입력값에서 찾아 반환합니다.
또한, 정규 표현식의 패턴 표현은 어떤 프로그래밍 언어를 사용하던 동일한 의미를 갖습니다.
만약 정규 표현식을 사용하지 않고 문자열에서 특정 패턴을 찾는 경우 매우 복잡한 코드를 작성해야 합니다.
하지만 정규 표현식을 활용할 경우 코드가 매우 간결해지며 유사한 문자까지 일치시켜 검색할 수 있습니다.
패턴 정의
- 결과
- [‘Regular Expression’]
Python에서 정규 표현식 모듈은 re
로, 정규 표현식을 사용하기 위해 import
합니다.
정규 표현식을 사용하기 위해, 찾을 문자열의 패턴
을 정의합니다.
정규 표현식의 패턴을 구성할 때 일반적으로 패턴의 문자열은 로 문자열 표기법(Raw string notation)으로 작성합니다.
로 문자열 표기법은 문자열에 ‘r’을 포함해 작성합니다.
위 예제에서 패턴은 ((.*?))를 의미합니다.
이 패턴을 정규 표현식 컴파일 함수(re.compile)
로 Python 환경에 맞게 컴파일합니다.
re.compile(패턴, 플래그)
을 의미합니다.
패턴
은 검출할 문자열의 정규 표현식입니다.
플래그
는 컴파일할 때 추가적인 설정을 의미합니다.
먼저, 패턴에 들어가는 표현식과 플래그는 다음의 표와 같습니다.
메타 문자
메타 문자 | 설명 |
---|---|
. | 줄바꿈 문자를 제외한 모든 문자를 포함 |
? | 0개 또는 1개의 문자를 포함 |
* | 0개 이상의 문자를 포함 |
+ | 1개 이상의 문자를 포함 |
^ | 문자열의 시작과 일치(MULTILINE 플래그 설정 시 각 행의 처음과 매치) |
$ | 문자열의 끝과 일치(MULTILINE 플래그 설정 시 각 행의 마지막과 매치) |
| | 문자 OR 연산(둘 중 하나라도 매치) |
[] | 문자의 집합(집합 중 하나라도 매치) |
[^] | 문자 NOT 연산([^abc] = a, b, c 문자를 제외) |
[-] | 문자 범위 집합([0-9] = 0~9까지의 숫자만 매치) |
{n} | n회 반복인 문자를 포함 |
{n,m} | n회 이상, m회 이하 반복인 문자를 포함 |
{n,} | n회 이상 반복인 문자를 포함 |
() | 정규식 그룹화 |
(?:) | 정규식 그룹화 제외 |
이스케이프 문자 목록
이스케이프 문자 | 설명 |
---|---|
\w | 문자 또는 숫자와 매치 [a-zA-Z0-9_] |
\W | 문자 또는 숫자를 제외한 매치 [^a-zA-Z0-9_] |
\d | 숫자와 매치 [0-9] |
\D | 숫자를 제외한 매치 [^0-9] |
\s | 공백 문자와 매치 [\t\n\r\f\v] |
\S | 공백 문자를 제외한 매치 [^\t\n\r\f\v] |
\b | 단어 사이의 공백 매치 |
\B | 단어 사이의 공백을 제외한 매치 |
\A | 문자열의 처음과 매치 |
\Z | 문자열의 마지막과 매치 |
\\ | 역슬래시 |
\” | 큰따옴표 |
\’ | 작은따옴표 |
\t | 탭 |
( | 좌측 소괄호 |
) | 우측 소괄호 |
최소 매칭 문자 목록
최소 매칭 문자 | 설명 |
---|---|
?? | ?의 기능에서 반환되는 문자열을 최소 크기로 매치 |
*? | *의 기능에서 반환되는 문자열을 최소 크기로 매치 |
+? | +의 기능에서 반환되는 문자열을 최소 크기로 매치 |
{n,m}? | {n,m}의 기능에서 반환되는 문자열을 최소 크기로 매치 |
탐색 문자 목록
탐색 문자 | 설명 |
---|---|
(?=) | 긍정형 전방 탐색(앞의 문자가 포함되어야 함) |
(?!) | 부정형 전방 탐색(앞의 문자가 포함되지 않아야 함) |
(?<=) | 긍정형 후방 탐색(뒤의 문자가 포함되어야 함) |
(?<!) | 부정형 후방 탐색(뒤의 문자가 포함되지 않아야 함) |
플래그 목록
플래그 | 설명 |
---|---|
re.A re.ASCII |
\w, \W, \b, \B, \s, \S를 아스키코드로 매칭 |
re.U re.UNICODE |
\w, \W, \b, \B, \s, \S를 유니코드로 매칭 |
re.L re.LOCALE |
\w, \W, \b, \B, \s, \S를 현재 로케일 설정으로 매칭 |
re.I re.IGNORECASE |
대소문자 구분 없이 매칭 |
re.M re.MULTILINE |
문자열이 여러 줄인 경우 메타 문자 ^와 메타 문자 $는 각 행의 처음과 끝에 매칭 |
re.S re.DOTALL |
메타 문자 .이 줄바꿈 문자도 포함해서 매칭 |
re.X re.VERBOSE |
정규 표현식에 주석을 사용할 수 있도록 변경(#과 공백은 무시됨. 공백을 활용할 경우 메타 문자 \를 사용) |
정규 표현식에서 사용되는 문자와 플래그는 위와 같습니다.
모두 외울 필요는 없으며, 필요한 기능을 찾아서 응용해 활용하시면 됩니다.
메타 문자
, 이스케이프 문자
, 최소 매칭 문자
는 정규 표현식의 패턴을 정의할 때 사용됩니다.
예제에서 사용된 패턴 문자는 다음과 같습니다.
\(
와 \)
는 이스케이프 문자로, 좌측 소괄호와 우측 소괄호를 의미합니다.
즉, 소괄호로 감싸진 (.*?)
를 찾는다는 의미가 됩니다.
다음으로 나타나는 소괄호는 메타 문자로 정규식 그룹화
를 의미합니다.
정규식 그룹화란 여러 패턴 문자 중, 실제로 찾고 싶은 문자를 하나의 그룹으로 만드는 역할을 합니다.
그러므로, 소괄호 사이에 포함된 문자(.*?)
만 찾고 싶다는 의미가 됩니다.
.
은 메타 문자이며, *?
은 최소 매칭 문자
입니다.
.
은 줄바꿈 문자를 제외한 모든 문자를 포함입니다. 즉, 줄바꿈을 제외한 모든 문자를 찾습니다.
다음으로, *?
은 *의 기능에서 반환되는 문자열을 최소 크기로 매치입니다.
먼저, *
는 0개 이상의 문자를 포함한다는 뜻입니다.
이를 다시 정리해서 풀이한다면 다음과 같습니다.
줄 바꿈 문자를 제외한 모든 문자를 0개 이상 찾되, 최소 크기로 찾는다.
여기서 최소 크기는 다음과 같이 설명할 수 있습니다.
ABC라는 문자열에 (.*?)
로 매칭한 다음 -
라는 문자을 붙인다면, -A-B-C-
의 형태가 됩니다.
?
문자를 제외하고 (.*)
로 매칭한 다음 -
라는 문자를 붙인다면, ABC-
의 형태가 됩니다.
- Tip : *은 0개 이상을 찾으므로, 문자가 없는 맨 앞줄도 찾아지게 됩니다.
다시, \((.*?)\)
를 풀이한다면 다음과 같습니다.
소괄호로 둘러 쌓인 문자열을 찾아 하나의 그룹으로 형성한다.
이미 소괄호로 둘러 쌓인 문자열로 정의했기 때문에, 예제 기준으로는 ?
를 포함 유/무는 큰 차이가 없습니다.
하지만, 소괄호 안에 또 다른 소괄호가 있다면 결과가 달라집니다.
위와 같은 문자열에서 \((.*?)\)
와 \((.*)\)
를 적용한 결과는 다음과 같습니다.
\((.*?)\)
: Regular (정규 표현식
\((.*)\)
: Regular (정규 표현식) Expression
그러므로, 정규 표현식의 패턴을 정의할 때 전체 데이터의 구조가 어떻게 되어있는지 고려해서 패턴을 구성해야 합니다.
위와 같은 경우가 빈번하게 발생하며 원하지 않는 문자열 패턴이 검출되거나 검출하지 못할수도 있습니다.
패턴 정의가 모두 완료됐다면, 목록 반환 검출 함수(re.findall)
로 문자열에서 패턴을 검출할 수 있습니다.
re.findall(패턴, 문자열, 플래그)
를 의미하며, 목록(List)의 형태로 검출 결과를 반환합니다.
매치 객체
- 결과
<re.Match object; span=(7, 27), match=’(Regular Expression)’>
(Regular Expression) 7
앞선 목록 반환 검출 함수(re.findall)
로 문자열을 검출한다면 단순하게 찾은 문자열만 반환합니다.
만약, 더 세부적인 정보를 필요로 한다면 매치(Match)
객체를 반환해야합니다.
매치 객체는 검출된 문자열의 그룹을 상세하게 나누거나 검췰된 문자열의 색인 값 등 자세한 정보를 담고 있습니다.
그룹
은 패턴에 포함된 소괄호()
를 의미합니다.
매치 반환 전체 문자열 검출 함수(re.search)
로 문자열에서 패턴을 검출할 수 있습니다.
re.search(패턴, 문자열, 플래그)
를 의미하며, 매치(Match)의 형태로 검출 결과를 반환합니다.
매치 객체의 메서드와 속성은 다음과 같습니다.
매치 메서드
메서드 | 설명 |
---|---|
match.group() | 매칭된 문자열의 그룹을 반환 |
match.group(n) | 매칭된 문자열의 n번째 그룹을 반환 |
match.groups() | 매칭된 문자열의 그룹을 튜플로 반환 |
match.groupdict() | 매칭된 문자열의 그룹을 사전으로 반환 |
match.start(n/name) | 매칭된 문자열 그룹의 시작 색인 값을 반환 |
match.end(n/name) | 매칭된 문자열 그룹의 종료 색인 값을 반환 |
match.span() | 매칭된 문자열 그룹의 (시작, 끝)에 해당되는 색인 값을 튜플을 반환 |
매치 속성
속성 | 설명 |
---|---|
match.string | 입력 문자열(string)을 반환 |
match.pos | 입력 문자열(string)의 검색을 시작하는 위치 반환 |
match.endpos | 입력 문자열(string)의 검색을 종료하는 위치 반환 |
match.lastindex | 매칭된 문자열의 마지막 색인을 반환(없을 경우 None을 반환) |
match.lastgroup | 매칭된 문자열의 마지막 이름을 반환(없을 경우 None을 반환) |
매치 반환 전체 문자열 검출 함수(re.search)
는 하나의 대상만 검출합니다.
만약, 예제에서 쉼표(,)
앞에 있는 문자열을 검출한다고 가정하면 검색
만 검출하며 분리
나 활용되며
는 검출되지 않습니다.
여러 대상을 검출하려면 반복자 반환 검출 함수(re.finditer)
를 사용해야 합니다.
Python 정규 표현식에서 사용할 수 있는 함수는 아래와 같습니다.
정규 표현식 함수
패턴(pattern)
과 플래그(flags)
를 컴파일해서 정규 표현식 객체로 반환합니다.
입력 문자열(string)
에서 패턴(pattern)
과 일치하는 문자를 목록으로 반환합니다.
입력 문자열(string)
에서 패턴(pattern)
과 일치하는 문자를 Match 객체 반복자로 반환합니다.
입력 문자열(string)
에서 패턴(pattern)
과 일치하는 문자를 최대 분할 크기(maxsplit)
개수만큼 분할해 목록으로 반환합니다.
(만약 최대 분할 크기(maxsplit)에 3을 입력할 경우, 반환되는 리스트의 길이는 4가 됩니다.)
입력 문자열(string)
에서 패턴(pattern)
과 일치하는 문자를 패턴 최대 반복 수(count)
만큼 반복해 repl
로 대체해서 문자열로 반환합니다.
(패턴 최대 반복 수(count)가 0일 경우, 횟수 제한 없이 모두 대체합니다.)
입력 문자열(string)
에서 패턴(pattern)
과 일치하는 문자를 패턴 최대 반복 수(count)
만큼 반복해 repl
로 대체해서 튜플로 반환합니다.
(패턴 최대 반복 수(count)가 0일 경우, 횟수 제한 없이 모두 대체합니다.)
입력 문자열(string)
의 첫 부분에 대해 패턴(pattern)
과 일치하는 문자를 Match 객체로 반환합니다.
(없을 경우 None을 반환합니다.)
입력 문자열(string)
의 전체에 대해 패턴(pattern)
과 일치하는 문자를 Match 객체로 반환합니다.
(없을 경우 None을 반환합니다.)
댓글 남기기