정규표현식

hjoon·2022년 2월 4일
0

python 정리

목록 보기
24/26
post-thumbnail

문자열 판단

re.match('패턴', '문자열')

  • match 함수는 문자열 처음부터 매칭되는지 판단
>>> import re
>>> re.match('Hello', 'Hello, world!')     # 문자열이 있으므로 정규표현식 매치 객체가 반환됨
<_sre.SRE_Match object; span=(0, 5), match='Hello'>
>>> re.match('Python', 'Hello, world!')    # 문자열이 없으므로 아무것도 반환되지 않음
  • 'Hello, world!' 문자열에 'Hello'와 'Python'이 있는지 판단

## 문자열이 맨 앞에 오는지 맨 뒤에 오는지 판단

  • ^문자열 : 문자열 앞에 ^를 붙이면 문자열이 맨 앞에 오는지 판단
  • 문자열$ : 문자열 뒤에 $를 붙이면 문자열이 맨 뒤에 오는지 판단

re.search('패턴', '문자열')

  • search는 문자열 일부분이 매칭되는지 판단
>>> re.search('^Hello', 'Hello, world!')     # Hello로 시작하므로 패턴에 매칭됨
<_sre.SRE_Match object; span=(0, 5), match='Hello'>
>>> re.search('world!$', 'Hello, world!')    # world!로 끝나므로 패턴에 매칭됨
<_sre.SRE_Match object; span=(7, 13), match='world!'>

## 지정된 문자열이 하나라도 포함되는지 판단

|: 특정 문자열에서 지정된 문자열(문자)이 하나라도 포함되는지 판단

  • 문자열|문자열
  • 문자열|문자열|문자열|문자열
>>> re.match('hello|world', 'hello')    # hello 또는 world가 있으므로 패턴에 매칭됨
<_sre.SRE_Match object; span=(0, 5), match='hello'>


범위 판단

숫자 범위는 0-9처럼 표현

  • [0-9]* : *는 문자(숫자)가 0개 이상 있는지 판단
  • [0-9]+ : +는 1개 이상 있는지 판단
>>> re.match('[0-9]*', '1234')    # 1234는 0부터 9까지 숫자가 0개 이상 있으므로 패턴에 매칭됨
<_sre.SRE_Match object; span=(0, 4), match='1234'>
>>> re.match('[0-9]+', '1234')    # 1234는 0부터 9까지 숫자가 1개 이상 있으므로 패턴에 매칭됨
<_sre.SRE_Match object; span=(0, 4), match='1234'>
>>> re.match('[0-9]+', 'abcd')    # abcd는 0부터 9까지 숫자가 1개 이상 없으므로 패턴에 매칭되지 않음

a*b, a+b

  • b는 무조건 있어야 하는 문자
  • 'ab', 'aab', 'aaab'처럼 a가 0개 이상 또는 1개 이상 있어야 함
>>> re.match('a*b', 'b')      # b에는 a가 0개 이상 있으므로 패턴에 매칭됨
<_sre.SRE_Match object; span=(0, 1), match='b'>
>>> re.match('a+b', 'b')      # b에는 a가 1개 이상 없으므로 패턴에 매칭되지 않음
>>> re.match('a*b', 'aab')    # aab에는 a가 0개 이상 있으므로 패턴에 매칭됨
<_sre.SRE_Match object; span=(0, 3), match='aab'>
>>> re.match('a+b', 'aab')    # aab에는 a가 1개 이상 있으므로 패턴에 매칭됨
<_sre.SRE_Match object; span=(0, 3), match='aab'>

## 문자가 한 개만 있는지 판단

  • 문자? : ? 앞의 문자(범위)가 0개 또는 1개인지 판단
    • [0-9]?
  • . : .이 있는 위치에 아무 문자(숫자)가 1개 있는지 판단
>>> re.match('abc?d', 'abd')         # abd에서 c 위치에 c가 0개 있으므로 패턴에 매칭됨
<_sre.SRE_Match object; span=(0, 3), match='abd'>
>>> re.match('ab[0-9]?c', 'ab3c')    # [0-9] 위치에 숫자가 1개 있으므로 패턴에 매칭됨
<_sre.SRE_Match object; span=(0, 4), match='ab3c'>
>>> re.match('ab.d', 'abxd')         # .이 있는 위치에 문자가 1개 있으므로 패턴에 매칭됨
<_sre.SRE_Match object; span=(0, 4), match='abxd'>

## 문자 개수 판단

  • 문자{개수} : 문자(숫자)가 정확히 몇 개 있는지 판단한다
    • h{3} : h가 3개 있는지 판단
  • (문자열){개수} : 문자열의 경우에는 문자열을 괄호로 묶고 뒤에 {개수} 형식을 지정
    • (hello){3} : hello가 3개 있는지 판단
>>> re.match('h{3}', 'hhhello')
<_sre.SRE_Match object; span=(0, 3), match='hhh'>
>>> re.match('(hello){3}', 'hellohellohelloworld')
<_sre.SRE_Match object; span=(0, 15), match='hellohellohello'>
  • [0-9]{개수} : 특정 범위의 문자(숫자)가 몇 개 있는지 판단
>>> re.match('[0-9]{3}-[0-9]{4}-[0-9]{4}', '010-1000-1000')    # 숫자 3개-4개-4개 패턴에 매칭됨
<_sre.SRE_Match object; span=(0, 13), match='010-1000-1000'>
>>> re.match('[0-9]{3}-[0-9]{4}-[0-9]{4}', '010-1000-100')   # 숫자 3개-4개-4개 패턴에 매칭되지 않음
  • (문자){시작개수,끝개수}
  • (문자열){시작개수,끝개수}
  • [0-9]{시작개수,끝개수}

{시작개수,끝개수} 형식으로 시작 개수와 끝 개수를 지정해주면 특정 개수 사이에 들어가는지 판단한다.

>>> re.match('[0-9]{2,3}-[0-9]{3,4}-[0-9]{4}', '02-100-1000')    # 2~3개-3~4개-4개 패턴에 매칭됨
<_sre.SRE_Match object; span=(0, 11), match='02-100-1000'>
>>> re.match('[0-9]{2,3}-[0-9]{3,4}-[0-9]{4}', '02-10-1000')  # 2~3개-3~4개-4개 패턴에 매칭되지 않음


그룹 사용

  • (정규표현식) (정규표현식) : 패턴 안에서 정규표현식을 ( )(괄호)로 묶으면 그룹이 된다.
    • 매치객체.group(그룹숫자)
    • 매치객체.groups()
>>> m = re.match('([0-9]+) ([0-9]+)', '10 295')
>>> m.group(1)    # 첫 번째 그룹(그룹 1)에 매칭된 문자열을 반환
'10'
>>> m.group(2)    # 두 번째 그룹(그룹 2)에 매칭된 문자열을 반환
'295'
>>> m.group()     # 매칭된 문자열을 한꺼번에 반환
'10 295'
>>> m.group(0)    # 매칭된 문자열을 한꺼번에 반환
'10 295'
>>> m.groups()    # 각 그룹에 해당하는 문자열을 튜플 형태로 반환
('10', '295')

## 패턴에 매칭되는 모든 문자열 가져오기

그룹 지정 없이 패턴에 매칭되는 모든 문자열을 가져오려면

re.findall('패턴', '문자열')을 사용한다.

>>> re.findall('[0-9]+', '1 2 Fizz 4 Buzz Fizz 7 8')
['1', '2', '4', '7', '8']


⭐match vs fullmatch

  1. match 메소드는 문자열 처음부터 시작해서 패턴에 일치하는지 확인한다. (문자열 처음부터 Greedy하게 확인한다)

  2. fullmatch는 일치 여부를 확인하는 패턴과 대상 패턴이 정확하게 처음과 끝이 전부 일치해야 한다. (처음부터 확인해 가는게 아니라, 끝까지 탐색한 뒤에 일치 여부를 판단한다)

print(re.match('aa', 'aabbbbbb')) # <re.Match object; span=(0, 2), match='aa'>
print(re.fullmatch('aa', 'aabbbbbb')) # None

0개의 댓글