Search

re 모듈 사용하기

정규 표현식을 말한다. 제공해주는 함수에는 match(), fullmatch(), findall(), search() 등이 있다.
문자열 안에 정수만 추출하고 싶을 경우
import re re.findall('\d+', 'abc123def56zz') # ['123', '56']
Python
복사

match(패턴, 문자열, 플래그)

문자열의 처음부터 시작해서 작성한 패턴이 일치하는지 확인하는 함수
import re print(re.match('a', 'ab')) print(re.match('a', 'ab')) print(re.match('a', 'bba')) print(re.match('a', 'ba')) # <re.Match object; span=(0, 1), match='a'> # <re.Match object; span=(0, 1), match='a'> # None # None
Python
복사
1,2번의 시작이 ‘a’ 로 시작하기 때문에 매칭이 되었지만, 3,4번은 시작이 ‘b’로 시작해서 매칭이 되지 않았다.

search(패턴, 문자열, 플래그)

match() 와 유사하지만 패턴이 문자열의 처음부터 일치하지 않아도 되는 함수
import re print(re.search('a', 'ab')) print(re.search('a', 'ab')) print(re.search('a', 'bba')) print(re.search('a', 'ba')) # <re.Match object; span=(0, 1), match='a'> # <re.Match object; span=(0, 1), match='a'> # <re.Match object; span=(2, 3), match='a'> # <re.Match object; span=(1, 2), match='a'>
Python
복사
1,2,3,4 번이 모두 문자열 내에 포함되므로 매칭이 성공적으로 되었다.

findall(패턴, 문자열, 플래그)

문자열 안에 패턴에 맞는 케이스를 전부 찾아서 리스트로 반환
import re print(re.findall('a', 'a')) print(re.findall('a', 'aba')) print(re.findall('a', 'baa')) print(re.findall('aaa', 'aaaaa')) print(re.findall('aaa', 'aaaaaa')) print(re.findall('\d', '숫자123이 이렇게56 있다8')) print(re.findall('\d+', '숫자123이 이렇게56 있다8')) # ['a'] # ['a', 'a'] # ['a', 'a'] # ['aaa'] # ['aaa', 'aaa'] # ['1', '2', '3', '5', '6', '8'] # ['123', '56', '8']
Python
복사

finditer(패턴, 문자열, 플래그)

finditer() 과 유사하지만 패턴에 맞는 문자열의 리스트가 아닌 iterator 형식으로 반환
import re re_iter = re.finditer('a', 'baa') for s in re_iter: print(s) # <re.Match object; span=(1, 2), match='a'> # <re.Match object; span=(2, 3), match='a'>
Python
복사

fullmatch(패턴, 문자열, 플래그)

문자열이 정확하게 패턴과 일치할 때 반환한다. match() 는 처음만 패턴에 맞으면 되지만 해당 함수는 처음부터 끝까지 정확하게 일치해야 한다.
import re print(re.fullmatch('a', 'a')) print(re.fullmatch('a', 'aaa')) print(re.fullmatch('a', 'ab')) print(re.fullmatch('a', 'ba')) print(re.fullmatch('a', 'baa')) # <re.Match object; span=(0, 1), match='a'> # None # None # None # None
Python
복사

split(패턴, 문자열, 최대 split 수, 플래그)

문자열에서 패턴이 맞으면 이를 기점으로 리스트로 쪼개는 함수. 3번째 인자(최대 split 수)를 지정하면 문자열을 지정한 수 만큼 쪼개고 그 수가 도달하면 쪼개지 않는다.
import re print(re.split('a', 'abaabca')) print(re.split('a', 'abaabca', 2)) # ['', 'b', '', 'bc', ''] # ['', 'b', 'abca']
Python
복사

sub(패턴, 교체할 문자열, 문자열, 최대 교체 수, 플래그)

문자열에 맞는 패턴을 2번째 인자(교체할 문자열)로 교체한다. 최대 교체 수를 지정하면 문자열에 맞는 패턴을 교체할 문자열로 교체하고 그 수가 도달하면 더이상 교체하지 않는다.
import re print(re.sub('a', 'z', 'ab')) print(re.sub('a', 'zxc', 'ab')) print(re.sub('a', 'z', 'aaaab')) print(re.sub('a', 'z', 'aaaab', 1)) # 교체할 최대 횟수 지정 # zb # zxcb # zzzzb # zaaab
Python
복사

subn(패턴, 교체할 문자열, 문자열, 최대 교체 수, 플래그)

sub() 와 동작은 동일. but, 반환 결과가 결과(문자열, 매칭횟수) 형태로 반환
import re print(re.subn('a', 'z', 'ab')) print(re.subn('a', 'zxc', 'ab')) print(re.subn('a', 'z', 'aaaab')) print(re.subn('a', 'z', 'aaaab', 1)) # ('zb', 1) # ('zxcb', 1) # ('zzzzb', 4) # ('zaaab', 1)
Python
복사

compile(패턴, 플래그)

만약 패턴과 플래그가 동일한 정규식을 여러번 사용하려면 compile()을 사용하여 지정한 다음, 위의 함수들을 사용할 수 있다.
import re c = re.compile('a') # 패턴이 'a' 인 것을 여러번 사용한다는 가정하에 print(c.sub('zxc', 'abcdefg')) print(c.search('vcxdfsa')) # zxcbcdefg # <re.Match object; span=(6, 7), match='a'>
Python
복사

purge()

위 compile() 로 만들어 놓은 객체는 캐시에 보통 100개까지 저장된다고 알려져 있고 그 수를 넘어가면 초기화된다. purge() 를 호출하면 100개가 넘어가지 않아도 초기화하는 함수다.
import re re.purge()
Python
복사

escape(패턴)

패턴을 입력받으면 특수문자들에 이스케이프(백슬래쉬) 처리를 한 다음 반환한다.
import re print(re.escape('(\d)')) # \(\\d\)
Python
복사

match object method()

findall() 을 제외하고 모든 함수들의 반환은 match object 로 반환된다. match object 에는 group(), start(), end() 등과 같이 찾은 패턴의 문자열 위치나 매칭 문자열을 반환하는 함수를 제공한다.
group(), start(), end(), span()
예를 들어 search() 로 패턴에 맞는 문자열을 찾았다 하면
→ group() 메서드를 통해 패턴에 맞는 문자열을 추출할 수 있고
→ start() 메서드를 통해 문자열의 어디부터 패턴에 맞는 문자가 있는지
→ end() 메서드를 통해 문자열의 어디까지인지
→ span() 메서드를 통해 문자열의 어디부터 어디까지인지
등을 확인할 수 있다.
import re result = re.search('aa', 'baab') print(result.group()) print(result.start()) print(result.end()) print(result.span()) # aa # 1 # 3 # (1, 3)
Python
복사