python regex cheatsheet

Cheatsheet for python regex

Regex module

re 모듈이 정규식을 지원한다.

match

re.match() 함수는 주어진 패턴을 문자열의 시작지점부터 적용하여 매칭되는 결과가 있으면 match 객체를, 그렇지 않은 경우 None을 리턴한다.

> re.match(r'\d', 'a1c2')
==> None
> re.match(r'a', 'a1c2')
<_sre.SRE_Match object at 0x028543A0>

match 객체는 그냥 매칭된 결과의 위치 정보를 담고 있다고 생각하면 된다.

> m = re.match(r'\d+', '123abc')
> m.start()
0
> m.end()
3

주의할 것은 re.match()는 검색을 하는 것이 아니라 문자열이 패턴에 대응하는지만 검사한다. 즉 문자열의 시작부분부터 패턴에 매칭되는 부분이 있어야 한다. (문자열의 처음부터 시작하는 일부분이 있으면 됨)

search

re.search() 함수는 문자열 전체에 대해 패턴을 매칭한다. 결과는 동일하다. 단, search는 문자열의 앞에서부터 매칭되는 곳을 찾아나가면서 패턴과 매칭되면 검색을 멈춘다.

> a = '''Python 2.7.6 (default, Nov 10 2013, 19:24:18) [MSC v.1500 32 bit (Intel)] on win32\nType "help", "copyright", "credits" or "license" for more information.\n'''
> s = re.search(r'(\d+[:\.]*){1,3}')
> s.group()
'2.7.6'

findall

re.findall() 함수는 문자열 전체에 대해 패턴을 매칭하고, 매칭된 결과를 리스트로 만들어서 리턴한다. 만약 패턴이 그룹을 포함하고 있으면 그룹 매칭에 대한 결과를 표시한다.

> re.findall(r'".+?"', a)
['"help"', '"copyright"', '"credits"', '"license"']
> re.findall(r'"(.+?)"', a)
['help', 'copyright', 'credits', 'license']

또한 패턴에 그룹이 2개 이상 있는 경우, 각 매칭마다 그룹단위로 나눠진 결과를 리턴한다.

sub

re.sub()는 문자열 전체에 대해 패턴을 매칭하여, 매칭된 부분을 주어진 값으로 바꾼다.

> re.sub(r'".+?"', '"xxxx"', a)
'Python 2.7.6 (default, Nov 10 2013, 19:24:18) [MSC v.1500 32 bit (Intel)] on win32\nType "xxxx", "xxxx", "xxxx" or "xxxx" for more information.\n'