IT 개발/Python

[파이썬] 정규표현식 개념 및 사용방법

KADOSHOLY 2023. 12. 15. 02:05
반응형

 

[파이썬] 정규표현식 개념 및 사용방법

 

 

   목차

  1. 정규표현식이란?
  2. 파이썬에서 정규표현식 사용방법
  3. 정규표현식 규칙

 

 

1. 정규표현식이란?

 

정규표현식 (Regular Expression)이란 특정한 규칙을 가진 문자열 집합을 표현하기 위해 사용하는 언어를 말하며, 문자열의 유효성 체크를 위해 사용됩니다 

 

 

 

2. 파이썬에서 정규표현식 사용방법

 

파이썬에서 정규표현식을 사용하기 위해서는 re 모듈을 import 한 후 아래와 같이 두가지 방식으로 사용할 수 있습니다.

 

import re
text = 'abc'

#방법1
pattern = re.compile('[a]')	#정규표현식 규칙 지정
print(pattern.search(text))

#방법2
print(re.search('[a]', text))	# 정규표현식 규칙 지정

####### [실행결과] #######
<re.Match object; span=(0, 1), match='a'>
<re.Match object; span=(0, 1), match='a'>

 

 

1) 정규표현식에서 사용되는 기호

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

 

2) 정규표현식 관련 메소드

  • search('문자열') : 문자열 전체중에서 정규표현식과 매치되는지 부분이 있는지 여부를 확인함 (매체된 객체 or None 반환)
  • match('문자열') : 문자열의 처음부터 정규표현식과 매치되는지 여부를 확인함 (매치된 객체 or None 반환)
  • findall('문자열') : 정규표현식과  매치되는 모든 문자열을 list로 반환함
  • finditer('문자열') : 정규표현식과 매치되는 모든 문자열을 iterator 객체로 반한함
  • sub('바꿀문자열', '문자열', 횟수) : 매칭되는 문자열을 변경

 

[사용예제]

import re

pattern = re.compile('ab')
str = '11abc22abc33abc'
print('1: ', pattern.search(str))
print('2: ', pattern.match(str))
print('3: ', pattern.findall(str))

m = pattern.finditer(str)
for i in m:
    print('4: ', i, i.group())

print('5: ', pattern.sub('XY', str, 2))

 

[실행결과]

1:  <re.Match object; span=(2, 4), match='ab'>
2:  None
3:  ['ab', 'ab', 'ab']
4:  <re.Match object; span=(2, 4), match='ab'> ab
4:  <re.Match object; span=(7, 9), match='ab'> ab
4:  <re.Match object; span=(12, 14), match='ab'> ab
5:  11XYc22XYc33abc

 

 

 

3. 정규표현식 규칙

 

1) [  ] :  문자클래스로 [  ] 사이에 있는 문자중 하나를 선택함. (or 개념)

  • [abc] : a, b, c 중 1개를 선택 
  • [a-z] : a ~ z 사이의 소문자중 1개를 선택
  • [A-Z] : A ~ Z 사이의 대문자중 1개를 선택
  • [0-9] : 0~9 사이의 숫자문자중 1개를 선택
  • [ㄱ-힣] : 모든 한글 문자중 1개를 선택
  • [0-9a-z] : 0-9 또는 a-z 사이의 문자중 1개를 선택

 

2) [^  ] :  [ ] 안에 ^ 사용시 [ ] 안에 문자를 제외한 나머지 문자중 하나를 선택함

  • [^abc] : a, b, c를 제외한 문자중 1개를 선택
  • [^a-z] : a ~ z 를 제외한 문자중 1개를 선택
  • [^0-9] : 0~9 를 제외한 문자중 1개를 선택

 

3)  .  :  모든 문자중 1개를 선택 (줄바꿈 문자인 \n 제외)

  • a.b : a + 모든문자중1개 + b 로 구성된 문자를 선택 (ex, aab, a1b, a가b)

 

4) [ . ] :  [  ] 안에 . 사용시 모든 문자가 아닌 . 자체를 의미

  • a[.]b : a.b를 선택

 

5)  *  :  (반복) 바로 앞에 있는 문자가 0개 이상 존재하는 문자를 선택

  • a*b : a가 0개 이상 + b로 구성된 문자를 선택 (ex, b, ab, aaaab)

 

6)  +  :  (반복) 바로 앞에 있는 문자가 1개 이상 존재하는 문자를 선택

  • a+b : a가 1개 이상 + b로 구성된 문자를 선택 (ex, ab, aaaab)

 

7) {m} :  (반복) 바로 앞에 있는 문자가 m번 존재하는 문자를 선택

  • a{3}b : aaab 문자를 선택

 

8) {m, n} :  (반복) 바로 앞에 있는 문자가 m ~ n번 등장하는 문자를 선택

  • a{1,3}b : a가 1~3개 + b로 구성된 문자를 선택 (ex, ab, aab, aaab)

 

9)  ?  :  (반복) 바로 앞에 있는 문자가 0 ~ 1번 등장하는 문자를 선택 ( {0,1}과 동일 )

  • a?b : a가 0~1개 + b로 구성된 문자를 선택 (ex, b, ab)

 

10)  ^  :  해당 문자열로 시작하는 문자열 선택

  • ^abc : abc로 시작하는 문자열을 선택 (ex, abc, abcddd)

 

11)  $  :  해당 문자열로 끝나는 문자열 선택

  • abc$ : abc로 끝나는 문자열을 선택 (ex, abc, dddabc)

 

12)  |  :  두 패턴 중 하나를 선택 (or)

  • ^a|^b : abc로 시작하거나 xyz로 시작하는 문자열을 선택 (ex, a, b, accc, bccc)

 

13) (  ) :  정규식 그룹화 

  • 패턴안에 ?P<name> 을 사용하면 이름을 붙일수 있. (?P<name> ... )
import re
pattern = re.compile('([0-9]{3})-([0-9]{4})-(?P<lastnumber>[0-9]{4})')
m = pattern.search('010-1234-5678')
print('group( )           : ',m.group())
print('group(0)           : ',m.group(0))
print('group(1)           : ',m.group(1))
print('group(2)           : ',m.group(2))
print('group(3)           : ',m.group(3))
print('group("lastnumber"): ',m.group("lastnumber"))
print('groupdict()        : ',m.groupdict())

####### [실행결과] #######
group( )           :  010-1234-5678
group(0)           :  010-1234-5678
group(1)           :  010
group(2)           :  1234
group(3)           :  5678
group("lastnumber"):  5678
groupdict()        :  {'lastnumber': '5678'}

 

 

반응형