Programming Language/Python

[Python] 23. 정규 표현식(regular expression)

lumana 2023. 11. 7. 22:07

정규 표현식


정규 표현식이란?


  • 정규 표현식 : 복잡한 문자열을 처리할 때 사용하는 기법

  • 파이썬 말고도 다른 곳에서도 사용함

정규 표현식이 필요한 이유?

  • example : 주민번호 뒷자리 7자리를 *로 변환하기
data = """
park 800905-1049118
kim 700905-1059919
"""

result = []
for line in data.split('\n'):
    word_result = []
    for word in line.split(" "):
        if len(word) == 14 and word[:6].isdigit() and word[7:].isdigit():
            word = word[:6] + "-" + "*******"
        word_result.append(word)
    result.append(" ".join(word_result))
print("\n".join(result))
  • 위 코드를 정규 표현식을 이용해 간략하게 표현할 수 있다.
import re

pat = re.compile("(\d{6})[-]\d{7}")
print(pat.sub("\g<1>-*******", data))

정규 표현식의 메타 문자


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

  • 문자 클래스 []

    • 문자클래스로 만들어진 정규식은 '[] 사이의 문자들과 매치'라는 의미를 갖는다.

    • 정규표현식이 [abc]라면 이 표현식은 a, b, c 중 한 개의 문자와 매치를 뜻한다

    • ex) 정규식이 [abc]라고 할 때

      • "a"는 정규식과 일치하는 문자 a가 있으므로 매치

      • "before"는 정규식과 일치하는 문자 b가 있으므로 매치

      • "dude"는 정규식과 일치하는 문자가 아무것도 없으므로 매치되지 않음

    • 하이픈(-)를 사용하면 범위(From ~ To)를 의미

      • [a-c]는 [abc]와 동일

      • [0-5]는 [012345]와 동일

      • [a-zA-Z] : 알파벳 모두

      • [0-9] : 숫자

    • ^은 not(반대)를 의미

      • [^0-9] : 숫자가 아닌 문자에 매칭
    • 별도의 표기법이 있는 표현식

      • \d : [0-9]

      • \D : [^0-9]

      • \s : whiltespace(space와 tab과 같은 공백을 표현하는 문자)와 매치, [\t\n\r\f\v]와 동일

      • \S : \s의 반대

      • \w : 문자 + 숫자, 언더바_와 매치, [a-zA-Z0-9_]와 동일

      • \W : 공백문자나 특수문자에 매치(\w의 반대)

  • Dot(.)

    • 줄바꿈 문자 \n을 제외한 모든 문자와 매치됨을 의미

    • example) a.b

      • "a + 모든문자 + b"와 같다

      • 즉 a와 b 사이에 어떤 문자가 들어가도 모두 매치된다를 의미

  • [.]

    • .문자가 있어야만 매치됨을 의미

    • example) a[.]b

      • a와 b 사이에 . 문자가 있어야 매치
  • 반복(*)

    • 반복을 의미하는 메타 문자

    • ex) ca*t

      • 문자 바로 앞에 있는 a가 0번 이상 반복되면 매치

      • ct : "a"가 0번 반복되어 매치

      • cat : "a"가 1번 반복되어 매치

      • caaat : "a"가 3번 반복되어 매치

  • 반복(+)

    • 반복을 나타내는 메타 문자

    • * 와 다르게 최소 1번이상 반복될 때 사용

    • ex) ca+t

      • 문자 바로 앞에 있는 a가 1번 이상 반복되면 매치

      • ct : "a"가 0번 반복되어 매치되지 않음

      • cat : "a"가 1번 반복되어 매치

      • caaat : "a"가 3번 반복되어 매치

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

    • { } 메타 문자를 사용해 반복 횟수를 고정할 수 있다

    • {m, n} : 반복 횟수가 m부터 n까지 매치 할 수 있음

    • m 또는 n은 생략할 수 있음

      • {3, } : 반복 횟수가 3 이상

      • {, 3} : 반복 횟수가 3 이하

      • 생략된 m : 0과 동일

      • 생략된 n : 무한대를 의미

    • ex) ca{2}t

      • a가 2번 반복되면 매치

      • cat : "a"가 1번 반복되어 매치되지 않음

      • caat : "a"가 2번 반복되어 매치

    • ex) ca{2, 5}t

      • a가 2~5번 반복되면 매치

      • cat : "a"가 1번 반복되어 매치되지 않음

      • caat : "a"가 2번 반복되어 매치

      • caaaaat : "a"가 5번 반복되어 매치

    • 반복은 아니지만, {0, 1}을 의미하는 ? 메타문자도 있음

    • ex) ab?c

      • b가 0~1번 사용되면 매치

      • abc : "b"가 1번 사용되어 매치

      • ac : "b"가 0번 사용되어 매치

      • 즉, "b"가 있거나 없거나 둘다 매치 되는 경우

  • *, +, ? 메타 문자 모두 {m,n}으로 나타낼 수 있지만, 이해하기 쉽고 간결하게 메타 문자를 가능하면 사용하자

참조) Do it! 점프 투 파이썬 (박응용 지음), https://wikidocs.net (파이썬 계단밟기)