[Python] 정규표현식(+메타문자)

Jimin_Note·2022년 6월 11일
0

[Python]

목록 보기
28/34

📍정규 표현식

특정한 규칙을 가진 문자열의 집합을 표현하기 위해 사용하는 형식
목적

  • 문자열의 검색과 치환
  • 간단한 표현
  • 조건문 간소화
import re #정규 표현식 사용을 위한 모듈 re(regular expression)

 example = re.compile('ab*c')  #p는 컴파일된 객체

📍메타 문자

그 문자가 가진 뜻이 아닌 특별한 용도로 사용하는 문자
. ^ $ * + ? { } [ ] \ | ( )

[0-9] : 숫자

[a-z] : 소문자

[A-Z] : 대문자

[a-zA-Z] : 영문자

[가~힣] : 완성형 한글

🌱[ ] Character class

[ ] 안의 문자들과 매치되는 지

정규표현식 [abc]

  • 'a' : 정규식과 일치라는 문자인 'a'가 있으므로 매치
  • 'banana' : 정규식과 일치하는 문자인 'a'와 'b'가 있으므로 매치
  • 'lemon' : 정규식과 일치하는 문자인 a, b, c 중 어느 하나도 포함하고 있지 않으니 매치X

🌱. Dot(.)

정규표현식 a.b

"a + 모든문자 + b"

  • 'acb' : 'a'와'b'로 모든 문자가 감싸있기 때문에 정규식과 매치
  • 'aab' : 'a'와'b'로 모든 문자가 감싸있기 때문에 정규식과 매치
  • 'abc' : 'a'와'c'로 모든 문자가 감싸있기 때문에 정규식과 매치X

a[.]b : 'a'와 'b'로 감싸져있는 문자열과 매치

  • 'aedb' : 매치
  • 'a123b' : 매치x

✏️ 반복

🌱 (*)

ab*c 0번이상 반복

  • ac : "b"가 0번 반복되어 매치
  • abc : "b"가 1번 반복되어 매치
  • abbbbc : "b"가 3번 반복되어 매치

🌱 (+)

ab+c 1번이상 반복

  • ac : "a"가 0번 반복되어 매치X
  • abc : "a"가 1번 반복되어 매치
  • abbbbc : "a"가 4번 반복되어 매치

🌱 ({m,n}, ?)

{ } 메타 문자를 사용하면 반복 횟수 고정
{m, n} : m부터 n까지 매치
ex)
{5,} : 5번 이상 반복
{,5} : 5번 이하 반복

{m} : 반드시 m번 반복
ab{3}c 반드시 'b'를 3번 반복

  • abbbbc : 'b'가 4번 반복되기 때문에 매치X
  • abbbc : 'b'가 3번 반복되기 때문에 매치

{m, n} : m~n번 반복
ab{3,6}c : 3~6번 반복

  • abc : 'b'가 1번만 반복되어 매치 x
  • abbbc : 'b'가 3번 반복되어 매치
  • abbbbbbc : 'b'가 6번만 반복되어 매치

?
메타문자 ?의 의미 : {0,1}
ex)
ab?c
"b? 있어도되고 없어도돼." 라는 뜻

  • ac : 없어도 매치니까 매치
  • abc :있어도 매치니까 매치

✏️ 문자열 검색(조사)

컴파일된 객체를 사용하여 문자열 검색

🌱 match

문자열[0]부터 매치되는지 조사

import re

p = re.compile('[a-z]+') #영어 소문자

print(p.match("abcde")) #<re.Match object; span=(0, 5), match='abcde'>
print(p.match("12345")) #None
print(p.search("123 abc")) #None / 문자열[0]부터 비교하기때문에 중간부분이 매치되더라도 None

문자열 전체를 검색

import re

p = re.compile('[a-z]+') #영어 소문자

print(p.search("abcde")) #<re.Match object; span=(0, 5), match='abcde'>
print(p.search("ab cde")) #<re.Match object; span=(0, 2), match='ab'>
print(p.search("123 abc")) #<re.Match object; span=(4, 7), match='abc'>
#search는 문자열 전체를 검색하기 때문에 중간부분에서 매치가 시작되도 매치성공

🌱 findall

p와 매치하여 리스트로 반환

import re

p = re.compile('[a-z]+') #영어 소문자

print(p.findall("jeong ji min")) #['jeong', 'ji', 'min']
print(p.findall('123 jeong ji 456 min')) #['jeong', 'ji', 'min']

🌱 finditer

import re

p = re.compile('[a-z]+') #영어 소문자
m = p.finditer('jeong ji min')

for i in m :print(i)

'''
<re.Match object; span=(0, 5), match='jeong'>
<re.Match object; span=(6, 8), match='ji'>
<re.Match object; span=(9, 12), match='min'>
'''

📍 |

or
match할 문자열의 앞부분부터 A|B A 또는 B와 일치하는지

import re

p = re.compile('Jeong|jimin') 
print(p.match('Jeongminji')) #<re.Match object; span=(0, 5), match='Jeong'>

print(p.match('jiminJeong')) #<re.Match object; span=(0, 5), match='jimin'>

print(p.match('Kimjimin')) #None

📍 ^

문자열의 맨 처음과 일치하는 지

import re

print(re.search('^Hello', 'Hello it`s me')) #<re.Match object; span=(0, 5), match='Hello'>

📍 $

문자열의 끝과 일치하는 지(^ 메타 문자와 반대)

import re

print(re.search('me$', 'Hello it`s me'))
#<re.Match object; span=(11, 13), match='me'>
profile
Hello. I'm jimin:)

0개의 댓글