About
home
About Me
home
🥧

Regular Expression

Date
2020/11/04
Writer
Category
Python
파이썬 정규표현식(Regular Expression) 주요 내용 정리입니다.
Index.
(*해당 모듈과 관련해서 정리된 내용 외에 사용할 함수가 있다면 주기적으로 업데이트할 예정입니다.)
정규표현식(Regular Expression)복잡한 문자열을 처리할 때 사용하는 기법이다.
정규표현식을 사용하면 특정 문자열이 주어진 정규표현식과 일치하는지 여부를 확인할 수 있다. 또한 정규표현식을 연결하여 새로운 정규표현식을 만들 수 있다. A와 B가 정규표현식이면 AB도 정규표현식인 셈이다. 문자열 p와 A가 일치하고 문자열 q와 B가 일치하면 문자열 pg가 AB와 일치하는 것도 같은 맥락으로 설명할 수 있다.
보통 텍스트에서 특정 문자열을 검색하거나 치환할 때 자주 사용된다.

1. Basic

정규표현식에서 사용하는 메타 문자로는 $ ^ * . + ? { } \ | ( ) 가 있다.
일반 문자로 매칭하고 싶다면 앞에 백슬래시 \ 를 붙여주면 된다. 예를 들어 \( 처럼 여는 소괄호 앞에 백슬래시 \ 를 붙여주면 '('와 매칭하게 된다.
자주 사용하는 것만 간단하게 정리해보면 다음과 같다.
[a-zA-Z] : 알파벳 전체
[0-9] : 숫자 전체
\d (== [0-9]) 숫자 전체
\D (== [^0-9]) 숫자 제외
\s (== [ \t\n\r\f\v]) whitespace 문자와 매칭
\S (== [^ \t\n\r\f\v]) whitespace 문자 제외
\w (== [a-zA-Z0-9_]) 문자 및 숫자 와 매치
\W (== [^a-zA-Z0-9_]) 문자 및 숫자가 아닌 문자와 매치
{m,n} - 반복횟수가 m부터 n까지 매치되고 m 또는 n 생략 가능 - (예. {3,} 반복횟수가 3 이상 {,3} 반복횟수가 3 이하) - * (== {1,}) 및 + (== {0,}) 와 동일한 표현 가능
? - 있어도 되고 없어도 된다. (예. ab?c , abc 도 되고 ac도 된다)
메타문자와 관련된 자세한 사항을 더 알고 싶다면 여기를 참고하면 된다.

2. Module "re"

파이썬은 정규표현식을 re 내장 모듈로 제공한다. 따라서 별도의 설치는 필요없다.
import re re.compile('[a-z]+')
Python

2.1. re.match()

re.match(pattern, string, [flags]) 함수는 문자열의 처음부터 시작하여 정규표현식과 매치되는지 확인한다. 사용법은 다음과 같다.
match = re.match('a','a') re.match('a', 'aba') re.match('a', 'bbc') re.match('a', 'cnn')
Python
결과
<re.Match object; span=(0, 1), match='a'> <re.Match object; span=(0, 1), match='a'> None None
PowerShell
매치가 되었을 때는 re.Match object 처럼 match object를 반환한다.
'bbc'와 'cnn'의 경우에는 문자 'a'로 시작하지 않아 패턴 'a'와 매치되지 않기에 None이 반환된다.

2.2. re.search()

re.search(pattern, string, [flags]) 함수는 문자열의 처음부터 반드시 일치해야 하는 것은 아니다. 예시를 살펴보면 다음과 같다.
search = re.search('a', 'a') re.search('a', 'aba') re.search('a', 'bbc') re.search('a', 'car')
Python
결과
<re.Match object; span=(0, 1), match='a'> None <re.Match object; span=(1, 2), match='a'>
PowerShell
re.search('a', 'car')에서 알 수 있듯 re.search() 함수는 중간부터라도 일치하는 패턴이 있는지 확인한다. 이때 span=(1, 2)는 1번째 문자, 즉 'car'의 첫 'a' (index 2)와 매치되었다는 뜻이다.

2.3. re.findall()

re.findall(pattern, string, [flags]) 함수는 이름에서 알 수 있듯이 문자열 중 패턴과 일치되는 부분을 전부 다 찾는다. 예시를 보면.
findall = re.findall('a', 'a') re.findall('a', 'aba') re.findall('a', 'bbc') re.findall('a', 'car') re.findall('a', 'mama')
Python
결과
['a' , 'a'] [] ['a'] ['a', 'a']
PowerShell
결과를 보면 해당 문자열의 a 개수대로 반환된 것을 알 수 있다.
이때 주의할 부분이 있다면 non-overlapping. 반환된 리스트는 서로 겹치지 않는다는 특성이 있다.
re.findall('aa', 'caaaaa')
Python
결과
['aa','aa']
PowerShell
이와 같이 서로 겹치지 않는 범위에서 두 개가 반환된 것을 알 수 있다.

2.4. re.finditer()

re.finditer(pattern, string, [flags]) 함수는 문자열 리스트 대신 match object를 반환한다.
finditer = re.finditer('a', 'aba')
Python

2.5. re.fullmatch()

re.fullmatch(pattern, string, [flags]) 함수는 패턴과 문자열이 전부다 일치하는지를 확인한다.
re.fullmatch('a','a') re.fullmatch('aa','aa') re.fullmatch('a', 'abc') re.fullmatch('aa', 'caa') re.fullmatch('aaa', 'aaaa')
Python
결과
<re.Match object; span=(0, 1), match='a'> <re.Match object; span=(0, 2), match='aa> None None None
PowerShell
예시를 통해 알 수 있듯, 문자열 전체가 패턴과 일치해야 반환됨을 알 수 있다. 따라서 일부만 매치되는 경우에도 None으로 반환되었다.

2.6 re.sub()

re.sub(pattern, repl, string, count, flags) 함수는 pattern에 일치되는 문자열을 repl 문자열로 치환해준다. 이때 count 파라미터를 통해 최대 몇 개까지 치환할 지 정할 수 있다.
re.sub(pattern='Tensorflow', repl='Pytorch', count=2, \ string='Tensorflow is the best opensource platform!')
Python
결과
'Pytorch is the best opensorce platform!'
PowerShell