본문 바로가기
Design/Python

[Python] 정규표현식 유효성 검사

by 공밀레의 재료 2024. 7. 28.
반응형

linux의 shell이나, vim에서 사용하는 정규표현식은 python에서도 사용이 가능하다.

이전 챕터에서 정규표현식에 대한 설명이 간략하게 있었지만, 이번에는 정규표현식을 간단하게 기본 문법을 설명하고, python에서 올바른 정규표현식인지 문법을 체크하는 코드에 대해서 설명하려고 한다.

https://gong-mil-le.tistory.com/52

 

[Python] 정규표현식을 이용한 이메일 유효성 검사

파이썬. 혹은 Linux에서 script를 작성하다 보면 정규표현식이라는 것을 자주 접할 수 있다. 물론, 저 두개의 케이스가 아니더라도 vim에서 원하는 문자열을 검색하거나 치환할때 정규표현식을 안다

gong-mil-le.tistory.com

 

우선 정규표현식을 검사하는 python 코드는 아래와 같다.

 

import re

def is_valid_regex(pattern) :
    try :
        re.compile(pattern)
        print("True")
    except re.error:
        print("False")

a = int(input())

for _ in range(a):
    is_valid_regex(input())

 

우선 코드를 하나한 설명해주면, 정규표현식을 사용하려면 re 모듈을 import 해줘야한다. 기본적으로 제공되는 모듈인 만큼 별도의 설치는 필요하지 않다.

re에 대해서 자세히 알고 싶으면 아래 공식홈페이지를 방문해서 읽는것이 좋다. 여기에 보면 다양한 기능들의 설명과 정규표현식에 대해서도 설명이 나와있지만 늘 그렇듯 영어로 작성되어있다.

https://docs.python.org/3/library/re.html#re.compile

 

re — Regular expression operations

Source code: Lib/re/ This module provides regular expression matching operations similar to those found in Perl. Both patterns and strings to be searched can be Unicode strings ( str) as well as 8-...

docs.python.org

 

여러가지 함수들이 있지만 정규표현식의 유효성검사는 re.compile(변수 혹은 문자열)으로 확인 할 수 있다. 만약 여기서 유효하지 않는 정규표현식이 들어간다면 엄청난 에러들이 주루룩 나올 것이기에 re.error 라는 에러코드로 예외처리를 해주는 것이 좋다.

이렇게 한다면 print 문을 통해서 True / False의 형태로 유효성을 검사 할 수 있다.

하지만!! 반드시 명심해야 할 것은 이것이 모든 것을 커버하지 않는다는 것이다.

실제로 필자의 경우 python3로 컴파일을 하는 경우에는 분명히 틀린 정규표현식이 맞다고 나오는 경우를 볼 수 있었다.

예를 들어 .*+

이유를 찾기 위해서 여러 경로로 찾아보았는데 인터프러터각 python3인지 혹은 pypy3 인지에 따라서 결과가 달라진다는 것이었다.

실제로 pypy3로 똑같은 코드를 실행하면 위에 적힌 .*+가 에러로 제대로 검출되는 것을 확인 할 수 있었다. 이는 나중에 기회가 생기면 따로 포스팅 할 수 있도록 하겠다.

 

여하튼, 정규표현식은 위와 같은 형태로 내가 작성한 정규표현식이 올바른 형태인지 확인이 가능하다.

반응형

그럼 이제부턴 정규표현식의 몇가지 기본적인 요소를 소개해볼까 한다.

  1. 문자열 매칭
    1. abc : 'abc'라는 문자열과 일치하는지 확인
  2. 메타 문자
    1. . : 임의의 한 문자와 일치
    2. \d : 숫자(0-9)
    3. \w : 단어(영문자, 숫자, 밑줄)
    4. \s : 공백(공백, 탭 등)
    5. \D : 숫자가 아닌 문자
    6. \W : 단어 문자가 아닌 문자(예를 들어 특수기호?)
    7. \S : 공백이 아닌 문자
  3. 문자 클래스
    1. [abc] : 'a' 'b' 'c' 중 하나
    2. [a-z] : 'a'에서 'z' 사이중에서 일치
    3. [A-Z] : 위와 같으나 대문자
    4. [0-9] : 숫자와 일치
  4. 경계
    1. ^ : 문자열의 시작
    2. $ : 문자열의 끝
    3. \b : 단어 경계
    4. \B : 단어 경계가 아님
  5. 반복
    1. * : 0회 이상 반복
    2. + : 1회 이상 반복
    3. ? : 0회 또는 1회 반복
    4. {n} : n번 반복
    5. {n, } : n회 이상 반복
    6. {, n} : n회 이하 반복
    7. {n, m} : n회 이상, m회 이하 반복
  6. 그룹화와 캡처
    1. (abc) : 'abc'와 일치하고 이를 캡처
    2. (?:abc) : 'abc'와 일치하지만 캡처하지 않음
  7. 논리 연산
    1. a|b : 'a' 또는 'b'와 일치

 

위 기본 요소들을 조합하면 다양한 정규표현식을 만들 수 있고, 이를 이용하면 스크립트의 효율성을 높일 수 있다. 특히 특정 패턴을 찾아야 하는 부분을 python에서 문자열 매칭을 이용해서 찾으려고 한다면 다양성이 떨어지고 코드가 복잡해지는 경우가 많다. 이때 정규표현식을 사용해서 검사를 할 수 있다면 훨씬 간결하고 코드의 효율성을 높일 수 있다. (가독성은 포기해야 한다)

 

 

반응형