일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 머신러닝
- 실습
- 실기
- 카카오
- 프로그래머스
- Python
- SQL
- 파이썬
- sklearn
- python3
- 데이터 분석
- oracle
- matplotlib
- 오라클
- seaborn
- 코딩테스트
- 튜닝
- 빅분기
- Oracel
- 알고리즘
- 빅데이터 분석 기사
- level 2
- Kaggle
- level 1
- Numpy
- R
- pandas
- Today
- Total
라일락 꽃이 피는 날
[Python] 정규 표현식 (regular expression) 2 본문
^, $
- ^ : 문자열의 맨 앞부터 일치하는 경우 검색한다.
- $ : 문자열의 맨 뒤부터 일치하는 경우 검색한다.
re.search(r'^b\w+a', 'babana') # <re.Match object; span=(0, 6), match='babana'>
re.search(r'^b\w+a', 'cabana') # None
re.search(r'b\w+a$', 'cabana') # <re.Match object; span=(2, 6), match='bana'>
re.search(r'b\w+a$', 'cabanap') # None
grouping
- 괄호()를 사용하여 그루핑한다.
- 매칭 결과를 각 그룹별로 분리 가능하다.
- 패턴을 명시 할 때, 각 그룹을 괄호() 안에 넣어 분리하여 사용한다.
m = re.search(r'(\w+)@(.+)', 'test@gmail.com')
print(m.group(1)) # test
print(m.group(2)) # gmail.com
print(m.group(0)) # test@gmail.com
{}
패턴뒤에 위치하는 중괄호{}에 숫자를 명시하면 해당 숫자 만큼의 반복인 경우에만 매칭한다.
ex) {4} - 4번 반복
ex) {3,4} - 3 ~ 4번 반복
re.search('pi{3}g', 'piiig') # <re.Match object; span=(0, 5), match='piiig'>
re.search('pi{3}g', 'piiiiig') # None
re.search('pi{3,5}g', 'piiiiig') # <re.Match object; span=(0, 7), match='piiiiig'>
re.search('pi{3,5}g', 'piiiiiig') # None
미니멈 매칭 (non-greedy way)
기본적으로 *, +, ?를 사용하면 greedy(맥시멈 매칭)하게 동작한다.
*?, +?을 이용하여 미니멈 매칭을 구현한다.
re.search(r'<.+?>','<html>haha</html>') # <re.Match object; span=(0, 6), match='<html>'>
{}?
{m,n}의 경우 m번에서 n번 반복하나 greedy하게 동작한다.
{m,n}?로 사용하면 non-greedy하게 동작한다. 즉, 최소 m번만 매칭하면 만족한다.
re.search(r'a{3,5}', 'aaaaa') # <re.Match object; span=(0, 5), match='aaaaa'>
re.search(r'a{3,5}?', 'aaaaa') # <re.Match object; span=(0, 3), match='aaa'>
match
- search와 유사하나, 주어진 문자열의 시작부터 비교하여 패턴이 있는지 확인한다.
- 시작부터 해당 패턴이 존재하지 않는다면 None을 반환한다.
re.match(r'\d\d\d', '123 is my number') # <re.Match object; span=(0, 3), match='123'>
re.match(r'\d\d\d', 'my number is 123') # None
findall
- search가 최초로 매칭되는 패턴만 반환한다면, findall은 매칭되는 전체의 패턴을 반환한다.
- 매칭되는 모든 결과를 리스트 형태로 반환한다.
re.findall(r'[\w-]+@[\w.]+', 'test@gmail.com haha test2@gmail.com nice test test')
# ['test@gmail.com', 'test2@gmail.com']
sub
- 주어진 문자열에서 일치하는 모든 패턴을 대체하여 그 결과를 문자열로 반환한다.
- 두번째 인자는 특정 문자열이 될 수도 있고 함수가 될 수도 있다.
- count가 0인 경우는 전체, 1이상이면 해당 숫자만큼 치환된다.
re.sub(r'[\w-]+@[\w.]+', 'great', 'test@gmail.com haha test2@gmail.com nice test test')
# 'great haha great nice test test'
re.sub(r'[\w-]+@[\w.]+', 'great', 'test@gmail.com haha test2@gmail.com nice test test', count=1)
# 'great haha test2@gmail.com nice test test'
compile
- 동일한 정규표현식을 매번 다시 쓰기 번거로움을 해결해준다.
- compile로 해당표현식을 re.RegexObject 객체로 저장하여 사용 가능하다.
email_reg = re.compile(r'[\w-]+@[\w.]+')
email_reg.search('test@gmail.com haha good') # <re.Match object; span=(0, 14), match='test@gmail.com'>
'프로그래밍 > Python' 카테고리의 다른 글
[Python] Open API (0) | 2021.08.22 |
---|---|
[Python] requests (0) | 2021.08.22 |
[Python] 정규 표현식 (regular expression) 1 (0) | 2021.08.16 |
[Python] Class Inheritance (상속) (0) | 2021.08.16 |
[Python] Class (클래스) (0) | 2021.08.16 |