정규 표현식이란?
정규 표현식은 복잡한 문자열을 처리할 때 사용하는 기법이다. 특정 패턴을 찾기 위한 문자열 처리 방식이다. 문자열을 처리하는 모든 곳에서 사용된다.
장점
- 짧고 간결한 코드로 복잡한 패턴을 쉽게 처리할 수 있음
- 유지보수와 가독성이 좋음
Raw String
정규식을 배우기 전, Raw String을 알고가야 한다.(사용을 하지 않을 시 "\" 문자열을 많이사용해야되기 때문) 문자열을 사용할 때,
p = re.compile("\section")
과 같은 "\" 문자를 이용해야 할 경우가 있다. 하지만 이와 같은 경우는 "\section"이 아닌 "\s" (white space) 로 인식을 하게 된다. 이를 백슬래시를 하나 더 넣어 방지할 수 있다.
p = re.compile("\\section")
하지만 "\"가 많이 사용될 경우 매우 번거러워지고 복잡해질 수 있기 때문에 raw string을 사용하게된다. 사용법은 다음과 같다.
import re
p = re.compile(r"\section")
이렇게 문자열 앞에 r을 이용하면 \를 2개로 인식하게끔 도와준다.
특수 시퀀스 정리
| 표기법 | 정규 표현식 | 설명 |
| \d | [0-9] | 모든 숫자와 일치 |
| \D | [^0-9] | 숫자가 아닌 모든 문자와 일치 |
| \s | [ \t\n\r\f\v] | 모든 공백문자(White space) 와 일치 |
| \S | [^ \t\n\r\f\v] | 공백문자(white space)가 아닌 모든 문자와 일치 |
| \w | [a-zA-Z0-9] | 단어를 구성하는 모든 문자(알파벳, 숫자, 밑줄)와 일치 |
| \W | [^a-zA-Z0-9] | 단어를 구성하지 않는 문자와 일치 |
정규식 메타문자 정리
| 표기법 | 설명 |
| . | 기본 문자에서는 줄바꿈 문자(\n)를 제외한 어떤 단일 문자와도 일치 |
| ^ | 문자열 시작의 위치, MULTILINE 모드에서는 각 줄바꿈 후에도 일치 |
| $ | 문자열의 끝의 위치, MULTILINE 모드에서는 줄바꿈 전에도 일치 |
| * | 바로 앞에 있는 패턴이 0회 이상 반복되는 것과 일치 |
| + | 바로 앞에 있는 패턴이 1회 이상 반복되는 것과 일치 |
| ? | 바로 앞에 있는 패턴이 0회 또는 1회 반복되는 것과 일치 |
| {m} | 바로 앞에 있는 패턴이 정확히 m회 일치 |
| {m,n} | 바로 앞에 있는 패턴이 정확히 m회에서 n회 일치 |
| [ ] | 문자열 집합을 나타내며, 예를 들어 [a,m,k]는 'a', 'm', 'k' 중 하나와 일치 |
| | | 선택을 의미하며 A|B 일 경우 A 또는 B 중 하나와 일치 |
| ( ) | 괄호 안의 정규식을 그룹으로 일치 |
| \b | 텍스트에서 완전히 독립된 단어를 찾고자 할 때 특히 유용 |
주요 예시와 코드
"."
import re
p1 = re.compile('a.b')
p2 = re.compile('a..b')
test1 = p1.findall('ab asb afb adeb affb abgrdbnb')
test2 = p2.findall('ab asb afb adeb aasdb abgrdbnb')
print(test1) # ['asb', 'afb']
print(test2) # ['adeb', 'asdb']
"^"
import re
p1 = re.compile('^book')
test1 = p1.findall('book is good')
test2 = p1.findall('I like book')
print(test1) # ['book']
print(test2) # []
"$"
import re
p1 = re.compile('book$')
test1 = p1.findall('book is good')
test2 = p1.findall('I like book')
print(test1) # []
print(test2) # ['book']
"*"
import re
p = re.compile('go*gle')
test1 = p.findall('gle ggle gogle google goooogle gooog')
print(test1) # ['ggle', 'gogle', 'google', 'goooogle']
"+"
import re
p = re.compile('go+gle')
test1 = p.findall('gle ggle gogle google goooogle gooog')
print(test1) # ['gogle', 'google', 'goooogle']
"?"
import re
p = re.compile('go?gle')
test1 = p.findall('gle ggle gogle google goooogle gooog')
print(test1) # ['ggle','gogle']
{m}
import re
p = re.compile('go{2}gle')
test1 = p.findall('gle ggle gogle google goooogle gooog')
print(test1) # ['google']
{m,n}
import re
p = re.compile('go{2,4}gle') # m,n 사이에 띄어쓰기하지 말것
test1 = p.findall('gle ggle gogle google goooogle gooog')
print(test1) # ['google', 'goooogle']
[ ]
import re
p = re.compile('[abc]')
test1 = p.findall('a cds asdf qwer before')
print(test1) # ['a', 'c', 'a', 'b']
|
import re
p = re.compile('a|b')
test1 = p.findall('a cds asdf qwer before')
print(test1) # ['a', 'a', 'b']
\b
import re
p = re.compile(r'\bclass\b')
test1 = p.findall('my class')
test2 = p.findall('mfseclasseaa')
print(test1) # ['class']
print(test2) # []
이메일 검증 정규 표현식
사용자_이름@도메인.최상위_도메인
사용자_이름 규칙
- @기호 앞에 위치
- 알파벳 대소문자, 숫자, 밑줄(_), 점(.), 더하기(+), 빼기(-) 포함 가능
- 사용자 이름은 하나의 문자 이상으로 구성
도메인 규칙
- @기호 바로 뒤에 위치
- 알파벳 대소문자, 숫자, 빼기(-) 포함 가능
최상위_도메인(TLD) 규칙
- 알파벳 대소문자, 숫자, 점(.), 빼기(-) 포함 가능
- 도메인 뒤에오는 '.com' 이 최상위 도메인
정규화 코드
import re
def validate_email(email):
pattern = re.compile(r"^[a-zA-Z0-9_.+-]+[@][a-zA-Z0-9-]+[.][a-zA-Z0-9.-]+$")
if pattern.match(email):
print("Valid email address.")
else:
print("Invalid email address.")
user_email = input("Enter your email: ")
validate_email(user_email)
'Python' 카테고리의 다른 글
| 파이썬 파일 입출력 (0) | 2024.10.01 |
|---|---|
| 파이썬을 이용한 디렉터리 모니터링 시스템 (0) | 2024.10.01 |
| 파일 및 디렉터리 제어 (0) | 2024.10.01 |
| 파이썬 데이터 구조 - 리스트, 튜플, 딕셔너리, 집합 (0) | 2024.09.26 |
| 파이썬 조건문/반복문 이해 및 활용 (0) | 2024.09.22 |
