정규표현식(Regular Expression)
- 정규표현식을 지원하기 위해 표준모듈 re 사용
- 원하는 문자열 패턴을 정의하여, 소스문자열과의 일치여부 판단
정규표현식을 왜 쓰는걸까?
파이썬 문자열에서 기본적으로 in,find(),index() 같은 함수로 문자열이 존재하는지, 어느위치에 있는지 알려준다.
하지만 문자열안에 정수만 추출하고 싶다면 문자열에서 제공하는 함수만으로 한계가 있다. 이때 정규표현식 사용
re모듈 함수
match(패턴,문자열) : 문자열의 처음부터 시작해서 작성한 패턴이 일치하는지 확인
import re
print(re.match('a','ab')) #<re.Match object; span=(0, 1), match='a'>
print(re.match('a','ba')) #None
search(패턴,문자열) : 문자열 안에 작성한 패턴이 일치하는지 확인,
패턴이 문자열의 처음부터 일치하지 않아도 댐 (match()차이)
import re
print(re.search('a','ab')) #<re.Match object; span=(0, 1), match='a'>
print(re.search('a','ba')) #<re.Match object; span=(1, 2), match='a'>
findall(패턴,문자열) : 문자열 안에 패턴에 맞는 케이스 전부를 리스트로 반환
print(re.findall('a','aba')) #[a,a]
print(re.findall('ba','baaba')) #[ba,ba]
finditer(패턴,문자열) : 문자열 안에 패턴에 맞는 케이스 전부를 iterator 형식으로 반환
re_iter = re.finditer('ba','baaba')
for s in re_iter:
print(s)
#<re.Match object; span=(0, 2), match='ba'>
#<re.Match object; span=(3, 5), match='ba'>
fullmatch(패턴,문자열) : 문자열에 시작과 끝의 패턴이 정확하게 일치할때 반환
print(re.fullmatch('a','aa')) #None
print(re.fullmatch('a','ab')) #None
print(re.fullmatch('aa','aa')) #<re.Match object; span=(0, 2), match='aa'>
split(패턴,문자열,최대split수) : 패턴이 맞으면 이 기점으로 리스트를 쪼개하는 함수
print(re.split('a','abaabca')) #['', 'b', '', 'bc', '']
print(re.split('a','abaabca',2)) #['', 'b', 'abca']
print(re.split('a','abaabca',3)) #['', 'b', 'bca']
print(re.split('a','abaabca',4)) #['', 'b', 'bc','']
sub(패턴,교체할문자열,문자열,최대교체수) : 패턴에 맞으면 그 문자를 교체할문자열로 교체는 함수
print(re.sub('a','z','ab')) #zb
print(re.sub('a','z','aaab')) #zzzb
print(re.sub('a','z','aaab',1)) #zaab
subn(패턴,교체할문자열,문자열,최대교체수) : 패턴에 맞으면 그 문자를 교체할문자열로 교체는 함수
-> (문자열,매칭횟수) 리턴
print(re.subn('a','z','ab')) #('zb',1)
print(re.subn('a','z','aaab')) #('zzzb',3)
print(re.subn('a','z','aaab',1)) #('zaab',1)
compile : 동일한 정규식을 여러번 사용할경우 패턴을 지정
이후 함수에서는 매개변수로 검색할 전체 '문자열'만 넣으면 댐!
import re
c=re.compile('a')
print(c.match('ab'))
print(c.search('abab'))
print(c.findall('baaba'))
compile패턴
예시 : ^패턴과 match을 사용해서 문자열의 접두사인지 확인할 수 있다.
import re #정규식 이용
def solution(phone_book):
for phone_number in phone_book:
#complie패턴^ : 이 패턴으로 시작해야함
tmp = re.compile("^"+phone_number)
print(tmp)
for phone_number2 in phone_book:
if tmp.match(phone_number2) and phone_number!=phone_number2:
return False
return True
https://namhandong.tistory.com/65
출처
https://brownbears.tistory.com/506
'🍃 Language > Python' 카테고리의 다른 글
[Python] 문자열 애너그램(Anagrams) | Counter(), DefaultDict() (0) | 2021.07.12 |
---|---|
[Python] 커스텀한 기준으로 sort()하기 cmp_to_key() (0) | 2021.07.12 |
[python] 대문자로 변환하기 upper() / capitalize() / title() (0) | 2021.07.11 |
[python] String을 식으로 반환해주는 eval() 함수 (0) | 2021.06.22 |
[Python] 순열(permutations )과 조합(combinations) (0) | 2021.05.26 |
[Python] 파이썬 enumerate 활용법 | for문을 파이썬스럽게 (0) | 2021.05.26 |