라일락 꽃이 피는 날

[Python] 정규 표현식 (regular expression) 2 본문

프로그래밍/Python

[Python] 정규 표현식 (regular expression) 2

eunki 2021. 8. 16. 23:43
728x90

^, $

  • ^ : 문자열의 맨 앞부터 일치하는 경우 검색한다.
  • $ : 문자열의 맨 뒤부터 일치하는 경우 검색한다.
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'>
728x90

'프로그래밍 > 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