[Python] 정규 표현식: 그룹핑

1 분 소요


앞에서 총 두차례 정규표현식에 대해 포스팅하면서 지금까지는 하나의 정규표현식만을 사용하며 그에 매칭이 되는지 여부를 판단하였다.

🙄 다양한 알고리즘 문제를 풀다 보니 서로 다른 정규표현식을 사용할 경우, 하나의 문자열에 반복해서 각각의 정규표현식과 매칭이 되는지 확인해야 하는 번거로움이 있었다.

하지만 정규표현식 그룹을 사용하게 되면 이러한 수고를 덜 수 있다!!

그렇다면 지금부터 본격적으로 정규표현식 그룹에 대해 알아보자!!


👩 정규표현식 그룹?

  • 여러 개의 정규표현식을 그룹으로 작성하여 해당 그룹과 일치하는 문자열을 각각 얻어오는 방식이다.
  • (정규표현식)(정규표현식)…
    • 다음과 같이 ()를 통해 정규표현식을 묶어 그룹을 만든다.


👩 매치객체.group(인덱스)?

import re

p = re.compile(r"(\d+[-]\d+[-]\d+)\s+(\w+)\s+(\d+)")
m = p.search("010-1111-2222 doyoul 23")

위 정규식은 “전화번호 + “ “ + 이름 + “ “ + 나이” 형태의 문자열을 찾는 정규식이다.

그렇다면 여기에서 매칭된 문자열에서 이름만을 가지고 오고 싶다면 어떻게 해야 할까??

🙄 이때 사용되는 것이 바로 group 메서드이다.

  • group(인덱스)를 사용함으로 그룹핑된 부분의 문자열을 뽑아낼 수 있게 된다.
인덱스
group() 매치된 전체 문자열을 얻어온다.
group(0) 매치된 전체 문자열을 얻어온다.
group(n) n번째 그룹에 해당되는 문자열을 얻어온다.

그렇다면 위에서 그룹핑된 부분을 각각 확인해보자!!

print(m.group()) # 010-1111-2222 doyoul 23
print(m.group(2)) # doyoul


👩 매치객체.groups()?

  • groups()의 사용은 더욱 간단하다. 이는 각 그룹에 해당하는 문자열을 튜플로 반환하게 된다.

그렇다면 위의 예에서 groups()를 사용하면 결과가 어떻게 될까?

print(m.groups()) # ('010-1111-2222', 'doyoul', '23')


👩 매치객체.group(‘그룹이름’)

단순히 인덱스를 통해서 값을 가져오는 것이 아닌 그룹이름을 지정해 그 값을 가져올 수 있다.

이때 사용되는 것이 바로 (?P< 그룹이름 >정규표현식)이다.

import re

p = re.compile(r"(?P<phone>\d+[-]\d+[-]\d+)\s+(?P<name>\w+)")
m = p.search("010-1111-2222 doyoul 23")

사용한 예시에 그룹이름을 적용해 보았다!!

그렇다면 결과도 바로 확인해보자!

print(m.group("phone")) #	010-1111-2222
print(m.group("name")) # doyoul


📃 참고

댓글남기기