[Python] 정규표현식 과 re 의 활용

김지환·2023년 3월 23일
0

TL;DR

정규표현식 Regular expression 줄여서 regex로 줄여서 표현하기도 한다. 정규표현식은 특정한 규칙을 가진 문자열의 집합을 표현하는 형식 언어로, 텍스트 검색이나 치환에 유용하게 사용된다. 정규표현식의 문법은 구현체마다 다를 수 있지만, 일반적으로 메타문자와 리터럴 문자로 구성되며, 반복, 선택, 그룹 등의 연산자를 사용할 수 있다.

예를 들어서 Python의 re 모듈을 사용하여 이메일을 겁색하는 예제를 만들어보면 아래와 같다.

import re

pattern = '[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}'

regex = re.compile(pattern, flags=re.IGNORECASE)

temp_email = "myemail@gmail.com"

if regex.fullmatch(temp_email):
	print("Valid")
else:
	print("Invalid")

flags인자로 re.IGNORECASE를 넣어 대소문자 구분을 제외한다. 또는

[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}

로 직접 표현해주는 것도 방법이다.

이렇게 특정한 문자열에 대한 처리를 할 때 유용하게 사용할 수 있는 것이 정규표현식이다.

정규표현식의 장단점

장점

  1. 입력 문자열의 처리 프로그램에서 다양한 형태의 문자열 입력에 대해 간결하게 처리할 수 있다.
  2. 정규 표현식은 다양한 언어와 프로그램에서 지원하는 범용성이 뛰어난 문법이기 때문에, 한번 잘 습득해둔다면 특정한 처리를 유사한 표현식으로 손쉽게 처리할 수 있다.
  3. 정규 표현식은 코드와 문서 생산성을 높여줄 수 있다.

단점

  1. 배우고 익히는 것이 쉽지 않습니다. 어려운 문법은 아니지만 내가 작성한 표현식이 어디가 어떻게 잘못되었는지, 어떻게 수정해야 하는지 등 표현식을 습득하는 것이 어렵다.
  2. 예외 케이스들이 생길 수 있고 이에 대한 충분한 예외처리가 필요하다.

메타표현식

  • . : 임의의 한 문자를 의미합니다. 예를 들어서 a.b는 ab와는 일치하지 않고, aab, acb, azb와 같이 a와 b 사이에 임의의 한 문자가 있는 경우에 일치합니다.
  • ^ : 문자열의 시작을 의미합니다. 예를 들어서 ^a는 a로 시작하는 문자열과 일치합니다.
  • $ : 문자열의 끝을 의미합니다. 예를 들어서 a$는 a로 끝나는 문자열과 일치합니다.
  • +: 앞의 문자가 0번 이상 반복되는 경우를 의미합니다. 예를 들어서 ab*c는 ac, abc, abbc, abbb와 같이 b가 0번 이상 반복되는 경우에 일치합니다.
  • : 앞의 문자가 1번 이상 반복되는 경우를 의미합니다. 예를 들어서 ab+c는 abc, abbc, abbbc와 같이 b가 1번 이상 반복되는 경우에 일치하고 ac와는 일치하지 않습니다.
  • ? : 앞의 문자가 0번 또는 1번 나타나는 경우를 의미합니다. 예를 들어서 ab?c는 ac나 abc와 일치하고 abbc와는 일치하지 않습니다.
  • | : 둘 중 하나를 선택하여 일치시킵니다. 예를 들어서 a|b는 a나 b와 일치합니다.
  • [ ] : 대괄호 안에 있는 문자들 중 하나와 일치시킵니다. 범위를 지정할 수도 있습니다. 예를 들어서 [abc]는 a나 b나 c와 일치하고 [a-z]는 소문자 알파벳 중 하나와 일치합니다.
  • [^ ] : 대괄호 안에 있는 문자들을 제외한 나머지 문자들과 일치시킵니다. 예를 들어서 [^abc]는 a,b,c가 아닌 다른 문자들과 일치하고 [^a-z]은 소문자 알파벳이 아닌 다른 문자들과 일치합니다.
  • ( ) : 괄호 안에 있는 표현식을 그룹으로 묶습니다. 그룹은 순서대로 번호가 매겨지며 역참조할 수 있습니다. 예를 들어서 (ab)+c 는 ababab…c 와 같이 ab가 1번 이상 반복되고 c로 끝나는 경우에 일치하고 \n(\d+)\s+\n(\w+) 는 숫자로 시작하고 공백을 거쳐 단어로 끝나며 \n1은 숫자 부분을 \n2은 단어 부분을 참조할 수 있습니다.

Python re tips

r-string

정규표현식을 사용할 때 r-string을 사용하면 좀 더 편하게 작성이 가능하다. r-string을 사용하면 \ 를통한 special character 처리를 하지 않기 때문에 \ 사용에 대한 복잡함이 줄어들게 된다. 자체적인 Python 의 처리 방식이 정규표현식 작성에 어려움을 주는 셈.

따라서 정규표현식을 작성할 때는 r-string을 적극 사용하는게 좋다.

compile 을 통한 regular expression object 활용

re.compile 함수를 통해서 regex object를 만들어서 사용이 가능하다.

import re

regex = re.compile("[^a-z]+", flags=(re.DOTALL | re.IGNORECASE))

위와 같이 regex object를 만들고 필요에 따라서 내장함수를 사용하여서 이용이 가능하다.

regex.match("abcd1234abcd1234") # 문자열이 해당 패턴으로 시작하는지
regex.search("abcd1234abcd1234") # 해당 패턴을 가지는 문자열이 있는지 확인.
regex.findall("abcd1234abcd1234") # 해당 패턴을 가지는 문자열들 모두를 list형태로.
regex.fullmatch("abcd1234abcd1234") # 문자열 전체에 대해서 매칭이 되는지 검사한다.

profile
Developer

0개의 댓글