2019년 12월 10일 화요일

파이썬 정규식 regex Grouping



Grouping

정규식에서 ( )괄호는 그룹을 이야기합니다.
이 Grouping은 꽤 유용한 방법중의 하나입니다.

각각의 매칭을 MatchObject로 넘기며, 크게 아래와 같은 두가지 방법이 있습니다.

  1. 순서대로 가져오는 방법 
  2. 이름을 지정해서 가져 오는 방법


Ordered Group

이 중 순서대로 가져오는 방법은 group(0) : 전체,
group(1) : 첫번째 괄호
group(2) : 두번째 괄호
이런식으로 전개할 수 있으며, 아래와 같이 전화번호 같은 것을 매칭을 할떄,
아래와 같은 형태로 매칭이 됩니다.


import re
p = re.compile('([\d]+)_([\d]+)')
m = p.search('345-1234')
m.group(0) # 345-1234
m.group(1) # 345
m.group(2) # 1234




Named Groups

이름에 매핑하는 방법은, 아래와 같이 작성해서, dictionary로 반환을 받는 방법입니다.
(?P<name>pattern)


import re
p = re.compile('(?P[\d]+)_(?P[\d]+)')
m = p.search('345-1234')
m.group(0) # 345-1234
m['first'] # 345
m['second'] # 1234

정규식에서 다시 값을 추출해서 특정 용도로 사용할때 , 중간단계를 사라지게 해서
편한 방법중 하나 입니다.


Back references 

back referencing(역참조)의 \1은 처음 사용한 표현식과 일치한다는 이야기입니다.
마찬가지로 \2, \3은 두번째 세번째 사용한 표현식과 일치한다는 것이고,
이 것은 주로 패턴이 반복되어서 나올때에 사용합니다

그리고, substitute (치환)을 할때, 매칭을 다시 가져다 쓸 때 사용합니다.
주로 언제 사용하냐면 순서를 바꿀때, 예를 들면, 첫번째 매칭이랑 두번째 매칭을 순서를 바꿀때, 이 방법이 유용합니다.

import re
p = re.compile('(?P[\d]+)_(?P[\d]+)')
m = p.sub('P\2_M\1','345-1234')
m # P1234_M345




댓글 없음:

댓글 쓰기