Python 정규 표현식

이하연·2020년 8월 10일
0

정규 표현식 ('정규식')

정규식이 필요한 이유 : 훨씬 간편하고 직관적인 코드 작성 가능

정규식 참고 링크


1. 정규 표현식의 기초, 메타 문자

메타 문자란, 원래 그 문자가 가진 뜻이 아닌 특별한 용도로 사용하는 문자

. ^ $ * + ? { } [ ] \ | ( )

1) 문자 클래스 []

  • 이 정규식은 "[] 사이의 문자들과 매치" 란 의미를 지님
  • 메타 문자인 [] 사이에는 어떤 문자도 들어감
  • [] 안의 두 문자 사이에 하이픈(-) 을 사용시 두 문자 사이의 범위(From-To) 를 의미
  • [] 안에 ^ 는 반대의 의미

[a-c] 는 [abc] 의미
[0-5] 는 [012345] 의미
[a-zA-z] 는 알파벳 모두
[0-9], \d : 숫자
\s : 문자
[^0-9], \D : 숫자가 아닌 문자
[a-zA-Z0-9_], \w : 문자+숫자
[^a-zA-Z0-9], \W : 문자와 숫자가 아닌 문자열들을 매칭

2) Dot(.)

  • 이 정규식은 줄바꿈 문자\n을 제외한 모든 문자와 매치됨
  • a.b"a + 모든문자 + b" 를 의미
    즉 a와 b라는 문자 사이에 어떤 문자가 들어가도 모두 매치됨을 의미

3) 반복(*)

  • 바로 앞에 있는 문자를 0부터 무한대로 반복될 수 있단 의미
  • 반복 횟수 0부터
  • {0,} 와 동일

4) 반복(+)

  • +는 최소 1번 이상 반복될 때 사용
  • {1,} 와 동일

5) 반복({m,n},?)

  • 반복횟수를 고정하고 싶을 때 사용
  • {m,} 는 반복 횟수가 m 이상인 경우
  • {,n} 는 반복 횟수가 n 이하인 경우
  • 생략된 m은 0
  • 생략된 n은 무한대

➊ {m}

  • 예시 : ca{2}t
    의미 : c+a(반드시 2번 반복)+t

➋ {m,n}

  • 예시 : ca{2,5}t
    의미 : c+a(2~5회 반복)+t

➌ ?

  • {0,1} 의미
  • 예시 : ca?t
    의미 : c+a(있어도 되고 없어도 된다)+t

2. 파이썬에서 정규 표현식을 지원하는 re모듈

import re
p = re.compile('ab*')

3. 정규식을 이용한 문자열 검색

  • 정규식 라이브러리
>>> import re
>>> p = re.compile('[a-z]+')
  • match, search는 정규식과 매치될때 객체를 돌려주고, 매치 되지 않을 땐 None을 돌려준다.

1) match

  • 문자열의 처음부터 정규식과 매치되는지 조사
  • 정규식과 매치
>>> m = p.match("python")
>>> print(m)
<_sre.SRE_Match object at 0x01F3F9F8>
  • 정규식과 부합
>>> m = p.match("3 python")
>>> print(m)
None
  • 문자열 전체를 검색하여 매치되는 게 있는지 확인
  • match 메서드와는 처음부터 검색할지의 여부 차이

3) findall

  • 정규식에 매치해서 리스트로 돌려줌
  • 예시
>>> result = p.findall("life is too short")
>>> print(result)
['life', 'is', 'too', 'short']

4) finditer

  • 반복 가능한 객체를 돌려줌
  • 반복 가능한 객체가 포함하는 각각의 요소는 match 객체

4. match, search 객체의 메서드


5. 메타문자

1. or과 동일한 문자 : |

2. 문자열 맨 처음과 일치함을 의미 : ^

3. 문자열의 끝과 매치함을 의미 : $

4. 문자열 처음과 매치 : \A

단, re.MULTILINE 옵션을 사용할 경우 줄과 상관없이 전체 문자열의 처음하고만 매치

5. 문자열 끝과 매치 : \Z

단, re.MULTILINE 옵션을 사용할 경우 전체 문자열의 끝과 매치

6. 단어 구분자 : \b


6. 그루핑 ()


예시

import re

input_user = input()
rule = re.compile('[a-c]+')

one = re.findall('b',input_user)
two = re.findall(rule,input_user)
three = re.findall('(\\w)(\\1*)',input_user)

print(one)
print(two)
print(three)

결과

aaabbccccdefff
['b','b']['aaabbcccc']
[('a','aa'),('b','b'),('c','ccc'),('d',''),('e',''),('f','ff')]

0개의 댓글