안녕하세요. IT 엘도라도 에 오신 것을 환영합니다.
글을 쓰는 것은 귀찮지만 다시 찾아보는 것은 더 귀찮습니다.
완전한 나만의 것으로 만들기 위해 지식을 차곡차곡 저장해 보아요.   포스팅 둘러보기 ▼

파이썬 (Python)

[Python] 정규 표현식(정규식) 사용하기

피그브라더 2021. 3. 4. 11:29

본 포스팅은 Python에서 정규식을 어떻게 사용할 수 있는지만 설명한다. 즉, 정규식 자체의 개념에 대해서는 설명을 생략한다. 만약 정규식 자체의 개념에 대해 알고 싶다면 이 포스팅을 참고하기 바란다. 프로그래밍 언어와는 독립적으로 정규식 자체의 개념에 대해 설명하고 있는 포스팅이다.

 

1. 정규식 표현 방법

Python에서는 정규식의 사용을 위해 re 모듈을 기본적으로 제공하고 있다. 즉, 정규식을 사용하고 싶다면 re 모듈을 먼저 import 해줘야 한다. Python에서 정규식은 패턴 객체로 표현된다. 패턴 객체는 re.compile() 함수를 이용하여 정규식을 컴파일 하면 생성된다. 이때 정규식을 작성하는 방법은 다음과 같이 두 가지이다.

정규식 작성 방법 패턴 객체 생성 예시 설명
r문자열 re.compile(r'\w+\s', re.I | re.S) 패턴 객체를 생성하는 가장 기본적인 방법이다. 정규식 옵션(= 플래그)들은 re.compile() 함수의 두 번째 인자에 나열하면 된다. 나열 시에는 | 연산자로 묶어주면 된다.
문자열 re.compile('\\w+\\s', re.I | re.S) 문자열 앞의 r을 생략해도 똑같이 패턴 객체를 생성할 수 있다.

단 이 방식은 백 슬래시(\)의 사용에 주의해야 한다. 왜냐하면 백 슬래시(\)는 Python의 문자열에서도 이스케이프가 필요한 문자이기 때문이다(본 예시 참고).

 

2. 정규식 사용 방법 (관련 API)

re.compile() 함수를 통해 정규식을 컴파일 하여 생성한 패턴 객체는 다음과 같은 메소드들을 제공한다.

메소드 설명
search(str) 메소드 주어진 문자열에서의 매칭 결과를 담은 매치 객체를 반환한다. 이는 주어진 문자열 전체를 검색하여 매칭이 되는지를 조사한다. 만약 매칭이 존재하지 않으면 None을 반환한다.
match(str) 메소드 주어진 문자열에서의 매칭 결과를 담은 매치 객체를 반환한다. 이는 주어진 문자열의 첫 부분부터 매칭이 되는지를 조사한다. 만약 매칭이 존재하지 않으면 None을 반환한다.
findall(str) 메소드 주어진 문자열에서 매칭 된 모든 문자열들이 담긴 리스트를 반환한다.
finditer(str) 메소드 findall() 메소드와 동일하지만, 각 요소가 매치 객체인 Iterable 객체를 반환한다는 것만 다르다.
sub(new_str|func, str, count=0) 메소드 두 번째 인자로 주어진 문자열에서 매칭 된 문자열이 첫 번째 인자로 주어진 문자열이나 함수에 의해 교체된 새로운 문자열을 반환한다. count 인자는 교체 횟수를 제어하며, 기본값은 0으로 매칭 된 모든 문자열들이 교체됨을 의미한다.

참고로, newStr에서 \g<n>은 n번째 그룹(소괄호로 감싸진 부분)을 의미하고, \g<abc>는 이름이 'abc'로 지정된 그룹을 의미한다.
subn(new_str|func, str, count=0) 메소드 sub() 메소드와 동일하지만, 튜플을 반환한다는 것만 다르다. 해당 튜플의 첫 번째 요소는 교체된 새로운 문자열이고, 두 번째 요소는 교체 발생 횟수이다.

 

패턴 객체의 search() 메소드와 match() 메소드가 반환하는 매치 객체는 다음과 같은 메소드들을 제공한다.

메소드 설명
group(n=0) 메소드 group(0) 매칭 된 문자열 전체를 반환한다.
group(n) n번째 그룹(소괄호로 감싸진 부분)에 매칭 된 문자열을 반환한다.
group('group_name') (?P<group_name> . . . ) 문법으로 이름이 지정된 그룹에 매칭 된 문자열을 반환한다. 참고로 이렇게 이름이 지정된 그룹을 정규식 내에서 재참조하고 싶다면 (?P=group_name)을 이용하면 된다.
start() 메소드 매칭 된 문자열의 시작 인덱스를 반환한다.
end() 메소드 매칭 된 문자열의 끝 인덱스를 반환한다.
span() 메소드 매칭 된 문자열의 (시작 인덱스, 끝 인덱스) 튜플을 반환한다.

 

기본적으로 re 모듈은 정규식을 컴파일 하고 그 결과에 해당하는 패턴 객체의 메소드를 호출하는 방식으로 사용이 된다. 그러나 re 모듈은 이러한 두 단계를 하나의 단계로 합쳐 더욱 간단하게 코딩을 할 수 있도록 다음과 같은 간편 함수들까지 제공한다. 위에서 설명한 패턴 객체의 메소드들과 일대일로 대응된다. (물론 이는 한 번 만든 패턴 객체를 여러 번 사용하고 싶은 경우에는 유용하지 않다는 것을 기억하자.)

  • re.search(regex, str, flags=0) 함수
  • re.match(regex, str, flags=0) 함수
  • re.findall(regex, str, flags=0) 함수
  • re.finditer(regex, str, flags=0) 함수
  • re.sub(regex, new_str|func, str, count=0, flags=0) 함수
  • re.subn(regex, new_str|func, str, count=0, flags=0) 함수

 

3. 정규식 옵션 설정 방법

Python에서 정규식 옵션(= 플래그)을 설정하는 방법은 다음과 같이 두 가지이다. 정규식 옵션을 여러 개 설정하려면 그것들을 | 연산자로 묶어주면 된다.

정규식 옵션 설정 방법 설명 예시
re.compile(정규식, 플래그) 정규식 컴파일 시 re.compile(r'\w+\s', re.I | re.S)
re.search( . . . , 플래그)
re.match( . . . , 플래그)
re.findall( . . . , 플래그)
re.finditer( . . . , 플래그)
re.sub( . . . , 플래그)
re.subn( . . . , 플래그)
re 모듈의 간편 함수 호출 시 re.search(r'\w+\s', 'python java js', re.I | re.S)

 

주로 사용하는 정규식 옵션들은 다음과 같다.

정규식 옵션(= 플래그) 설명
re.DOTALL (= re.S) .이 개행 문자를 포함하도록 한다.
re.IGNORECASE (= re.I) 대소문자 구분 없는 검색을 가능하게 한다.
re.MULTILINE (= re.M) 다중 행(multi-line) 검색을 가능하게 한다. 즉, ^과 &가 전체 문자열의 시작 부분과 끝 부분이 아닌 각 줄의 시작 부분과 끝 부분에 매칭 되도록 한다.
re.VERBOSE (= re.X) Verbose 모드를 사용할 수 있게 한다. 이 옵션을 설정하면 정규식 작성 시 이용한 공백 문자들은 컴파일 시에 제거가 된다(단, [ . . . ] 안에 작성된 것은 제외). 그리고 줄 단위로 # 기호를 사용하여 주석문을 작성할 수 있게 된다.