RegEx : Regular Expression (정규 표현식)

Sunwoo Pi·2023년 4월 26일
0
post-thumbnail

정규표현식

복잡한 문자열을 처리할 때 사용하는 기법, 모든 언어 공통

형식 : /[Pattern]/[Flag]

Pattern

Groups and Ranges

Character
 |또는
()그룹
[]문자셋, 괄호안의 어떤 문자든
[^]부정 문자셋, 괄호안의 어떤 문자가 아닐때
(?:)찾지만 기억하지는 않음

Quantifiers

Character
?없거나 있거나 (zero or one)
*없거나 있거나 많거나 (zero or more)
+하나 또는 많이 (one or more)
{n}n번 반복
{min,}최소
{min,max}최소, 그리고 최대

Character Classes

Character
.어떤 글자 (줄바꿈 문자 제외)
\특수 문자가 아닌 문자
\sspace 공백
\wword 문자
\ddigit 숫자
\Sspace 공백 아님
\Wword 문자 아님
\Ddigit 숫자 아님

Boundary Type

Character
\b단어 경계
\B단어 경계가 아님
^문장의 시작
$문장의 끝

Flag

Character
gglobal
mmultiline
icase insensitive
ssingle line (dotall)
uunicode
ysticky

with Python

re Module과 Pattern 객체 Method

import re

p = re.compile('[a-z]+') # Pattern Object
m1 = p.match('3 python')
m2 = p.match('python')
m3 = p.search('3 python') # 처음부터 일치하지 않아도 매칭
m4 = p.findall('life is too short')
m5 = p.finditer('life is too short')
print(f"m1 : {m1}") # None
print(f"m2 : {m2}") # Match Object
print(f"m3 : {m3}") # Match Object (꼭 처음부터 일치할 필요 x)
print(f"m4 : {m4}") # list
print(f"m5 : {m5}") # Iterator Object
for i in m5:
    print(i) # Match Object
    
# m2 = re.match('[a-z]+', 'python')과 같은 표현도 가능
    
# 문자열 바꾸기 : sub()
p = re.compile('(blue|white|red)')
m = p.sub('colour', 'blue socks and red shoes')
print(m) # "colour socks and colour shoes"

Match 객체 Method

p = re.compile('[a-z]+')
m = p.match('python')
print(m.group()) # 매치된 문자열을 리턴 : python
print(m.start()) # 매치된 문자열의 시작 위치 리턴 : 0
print(m.end()) # 매치된 문자열의 끝 위치 리턴 : 6
print(m.span()) # 매치된 문자열의 (시작, 끝)에 해당되는 튜플 리턴 : (0, 6)

Compile Option

# DOTALL, S : Dot(.)이 줄바꿈 문자도 포함하게끔 설정
p1 = re.compile('a.b')
p2 = re.compile('a.b', re.DOTALL) # re.DOTALL과 re.S 모두 사용 가능

print(p1.match('a\nb) # None
print(p2.match('a\nb') # Match Object

# IGNORECASE, I : 대소문자 상관없게끔 설정
p1 = re.compile('[a-z]+')
p2 = re.compile('[a-z]+', re.IGNORECASE)

print(p1.match('python')) # Match Object
print(p1.match('Python')) # None
print(p1.match('PYTHON')) # None
print(p2.match('python')) # Match Object
print(p2.match('Python')) # Match Object
print(p2.match('PYTHON')) # Match Object

# MULTILINE, M : ^를 각 Line의 처음으로 인식시케끔 설정
p1 = re.compile("^python\s\w+")
p2 = re.compile("^python\s\w+", re.MULTILINE)

data = """python one
life is too short
python two
you need python
python three
"""

print(p1.findall(data)) # ['python one']
print(p2.findall(data)) # ['python one', 'python two', 'python three']

RegEx in Python

# |
print(re.match('Crow|Servo', 'CrowHello')) # match='Crow'

# ^
print(re.search('^Life', 'Life is too short')) # match='Life'
print(re.search('^Life', 'My Life')) # None

# $
print(re.search('short$', 'Life is too short')) # match='short'
print(re.search('short$', 'Life is too short, you need python')) # None

# \b
p = re.compile(r'\bclass\b') # r''을 통해 String '\'을 Python에서 '\\'가 아닌 '\'로 표현 가능
print(p.search('no class at all')) # match='class'
print(p.search('the declassified algorithm')) # None
print(p.search('one subclass is ...')) # None

# Grouping ()
p = re.compile('(ABC)+')
m = p.search('ABCABCABC OK?')
print(m) # match='ABCABCABC'
print(m.group()) # ABCABC

p = re.compile("(\w+)\s+\d+[-]\d+[-]\d+")
m = p.search("park 010-1234-1234")
print(m.group()) # park 010-1234-1234
print(m.group(0)) # park 010-1234-1234
print(m.group(1)) # park

p = re.compile("(?P<name>\w+)\s+\d+[-]\d+[-]\d+")
m = p.search("park 010-1234-1234")
print(m.group("name")) # park

# 전방 탐색 : 긍정형 (?=)
p1 = re.compile(".+:")
p2 = re.compile(".+(?=:)") # 검색 조건에는 ':' 포함, 결과에는 ':' 미포함
m1 = p1.search("http://google.com")
m2 = p2.search("http://google.com")
print(m1.group()) # http:
print(m2.group()) # http

# 전방 탐색 : 부정형 (?!)
p1 = re.compile(".*[.](?!bat$).*$", re.M) # 결과에 'bat'으로 끝나는 것은 미포함
m1 = p1.findall("""
autoexec.exe
autoexec.bat
autoexec.jpg
""")
print(m1) # ['autoexec.exe', 'autoexec.jpg']

# Greedy vs Non-Greedy
s = '<html><head><title>Title</title>'
print(re.match('<.*>', s).group()) # <html><head><title>Title</title> : Greedy
print(re.match('<.*?>', s).group()) # <html> : Non-Greedy

<참고>
드림코딩 정규표현식 Youtube 강좌
https://www.youtube.com/watch?v=t3M6toIflyQ&list=PL1-s2FQ4BBUO1VkRXlEsQSvOXKbmjEJgN&index=7

조코딩 파이썬 정규표현식의 기초와 활용 Youtube 강좌
https://www.youtube.com/watch?v=dTDoTR0MXjU&list=PL1-s2FQ4BBUO1VkRXlEsQSvOXKbmjEJgN&index=13

profile
어려운 게 제일 싫어😝

0개의 댓글