본문 바로가기

Python/Basic

[Python]정규표현식 사용법

2022.05.16 - [Python] - [Python]정규표현식 라이브러리 사용법과 예제

정규표현식이란?

특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식

자주 쓰이는 표현

  • 숫자를 찾음: [0-9]
  • 숫자가 아닌것을 찾음: [^0-9]
  • white space 문자를 찾음: [\t\n\r\f\v]
  • white space 아닌 문자를 찾음: [^\t\n\r\f\v]
  • 문자, 숫자를 찾음: [0-9a-zA-Z]
  • 문자, 숫자 아닌것을 찾음: [^0-9a-zA-Z]
  • 한글을 찾음: [가-힣]
  • 한글 아니 것을 찾음: [^가-힣]

Dot(.)

  • Dot \. 메타 문자는 줄바꿈 문자인 \n를 제외한 모든 문자(한 개)를 의미함
  • 예: D.A 는 D + 모든 문자(한 개) + A 를 의미
    • DAA, DvA, D1A, D*A
  • 정말 Dot(.)이 들어간 패턴을 찾으려면?
    • \. 으로 표시하거나, [.] 으로 표시
    • pattern = re.compile('D\.A')
    • pattern = re.compile('D[.]A')

찾아 바꾸기

특정 패턴이 매칭되는 것을 찾아서, 다른 문자열로 바꾸기

  • re.sub(패턴, 바꿀데이터, 원본데이터)
string = "DDA D1A DDA DA DBA"
re.sub('D.A', 'Dave', string)    # 문자, 숫자가 아닌 데이터를 찾아서, '' 로 대체해라(삭제해라)

>>>
'Dave Dave Dave DA Dave'

반복되는 패턴 1 - ?, *, +

  • ? 는 앞 문자가 0번 또는 1번 표시되는 패턴 (없어도 되고, 한번 있어도 되는 패턴)
    • Dot(.)은 쓰이는 곳(앞,뒤)에 문자가 있는지 없는지가 중요
    • ? 는 쓰이는 곳 앞 문자로 판단
  • * 는 앞 문자가 0번 또는 그 이상 반복되는 패턴
  • + 는 앞 문자가 1번 또는 그 이상 반복되는 패턴
# ? 는 앞 문자가 0 or 1 번 반복되는 패턴
pattern2 = re.compile('d?t')

res1 = pattern2.search("date")
res2 = pattern2.search("ddddddtte")

print(res1)
print(res2)

# * 는 앞 문자가 0 or 그 이상 반복되는 패턴
pattern3 = re.compile('d*t')

res3 = pattern3.search("date")
res4 = pattern3.search("ddddddtte")

print(res3)
print(res4)

# + 는 앞 문자가 1번 또는 그 이상 반복되는 패턴
pattern4 = re.compile('d+t')

res5 = pattern4.search("date")
res6 = pattern4.search("ddddddtte")

print(res5)
print(res6)

>>>
<re.Match object; span=(2, 3), match='t'>
<re.Match object; span=(5, 7), match='dt'>
<re.Match object; span=(2, 3), match='t'>
<re.Match object; span=(0, 7), match='ddddddt'>
None
<re.Match object; span=(0, 7), match='ddddddt'>

반복되는 패턴 2 - {n}, {m,n}

  • {n} : 앞 문자가 n 번 반복되는 패턴
  • {m, n} : 앞 문자가 m 번 반복되는 패턴부터 n 번 반복되는 패턴까지
    • {m,n} 은 붙여 써야 함 {m, n} 으로 쓰면 안됨
## {n} : 앞 문자가 n 번 반복되는 패턴
pattern5 = re.compile('AE{3}A')

res7 = pattern5.search("AEEA")
res8 = pattern5.search("AEEEA")
res9 = pattern5.search("AEEEEA")

print(res7)
print(res8)
print(res9)

## {m, n} : 앞 문자가 m 번 반복되는 패턴부터 n 번 반복되는 패턴까지
pattern6 = re.compile('AE{3,5}A')

res10 = pattern6.search("AEEA")
res11 = pattern6.search("AEEEA")
res12 = pattern6.search("AEEEEA")
res13 = pattern6.search("AEEEEEA")

print(res10)
print(res11)
print(res12)
print(res13)

>>>
None
<re.Match object; span=(0, 5), match='AEEEA'>
None
None
<re.Match object; span=(0, 5), match='AEEEA'>
<re.Match object; span=(0, 6), match='AEEEEA'>
<re.Match object; span=(0, 7), match='AEEEEEA'>

괄호 안에 들어가는 문자가 들어 있는 패턴 - [문자]

  • 예: [abc] 는 a, b, c 중 하나가 들어 있는 패턴을 말함
  • 하이픈(-)을 이용하면 알파벳 전체를 나타낼 수 있음
    • [a-z], [A-Z],[0-9]
    • 대소문자 전체 : [a-zA-Z]
    • 대소문자+숫자전체 : [a-zA-Z0-9]
    • 한글 : [가-힣]
    • 한글이 아닌 것 : [^가-힣]
  • ^ 을 쓰면 그 뒤에 오는 문자가 아닌 패턴을 찾음
    • 문자를 결국 알파벳, 숫자, 특수문자, whitespace(스페이스, 탭, 엔터등) 로 분류할 수 있으므로
    • 알파벳, 숫자, 특수문자 : [^ \t\n\r\f\v] 는 이중에서 whitespace 가 아닌 알파벳, 숫자, 특수문자를 지칭함
    ## 괄호 안에 들어가는 문자가 들어 있는 패턴 - [문자]
    pattern7 = re.compile('[a-zA-Z]+')
    pattern8 = re.compile('[a-zA-Z0-9]+')
    pattern9 = re.compile('[가-힣]+')
    pattern10 = re.compile('[^가-힣]+')
    
    res14 = pattern7.search("가나abCD34")
    res15 = pattern8.search("가나abCD34")
    res16 = pattern9.search("가나abCD34")
    res17 = pattern10.search("가나abCD34")
    
    print(res14)
    print(res15)
    print(res16)
    print(res17)
    
    >>>
    <re.Match object; span=(2, 6), match='abCD'>
    <re.Match object; span=(2, 8), match='abCD34'>
    <re.Match object; span=(0, 2), match='가나'>
    <re.Match object; span=(2, 8), match='abCD34'>
    
https://www.inflearn.com/course/python-crawling-basic#