2023. 3. 25. 21:29ㆍit
0. 정규식이란
정규식(Regular Expression)은 문자열에서 패턴을 찾거나, 특정 문자열을 대체하거나, 추출하는 등의 작업을 수행하는데 사용되는 문자열 패턴이다. 정규식은 다양한 메타문자(meta-characters)를 사용하여 작성된다.
예를 들어, 이메일 주소, 전화번호, 우편번호, 주민등록번호 등과 같은 특정한 패턴을 가지는 문자열을 찾을 수 있다. 나 같은 경우, 스마트팩토리 구축 시 센서 ID를 추출하는 용도로 사용하기도 한다.
정규식은 다양한 프로그래밍 언어에서 지원이 되며, 해당 문법을 아고 있으면 문자열 파싱 작업에서 효과적인 업무 효율을 만들어 낼 수 있다. ( 하지만 조금 어렵다.. 나만 그런가..?? )
음, 예를 들어 아래와 같은 형식의 정규식이 있다.
[a-zA-Z0-9](-*[a-zA-Z0-9]){0,62} |
외계어로 보일수 있으나... 문법이다.. 해석을 하자면, 아래와 같다.
[a-zA-Z0-9]: 알파벳 대소문자와 숫자 중 하나
(-*[a-zA-Z0-9]): '-' 문자가 0개 또는 여러 개 있고, 그 뒤에 알파벳 대소문자와 숫자 중 하나가 오는 패턴
{0,62}: 이전 패턴이 0개부터 62개까지 반복될 수 있는 패턴
1. 기본 문법
솔직히 나는 아직도 정규식에 대해서 잘 모른다. ㅋㅋ 그냥 인터넷이나 내가 원하는 정규식을 찾아서 사용한다. 그래도 문법을 공부하고 이해하고 써먹는 게 좋으니, 한번 정리해 보겠다. ( 나도 잘 모르지만... )
1-1. 타입
\d: 숫자(digit)와 매칭됩니다.
\w: 문자(word)와 매칭됩니다. 알파벳, 숫자, 밑줄(_)을 포함합니다.
\s: 공백(space)과 매칭됩니다. 탭(\t), 개행(\n) 등의 문자도 포함합니다.
\D: 숫자가 아닌 문자와 매칭됩니다.
\W: 문자가 아닌 문자와 매칭됩니다.
\S: 공백이 아닌 문자와 매칭됩니다.
1-2. 문법
마침표(.): 어떤 문자 하나
별표(*): 바로 앞에 있는 문자나 그룹이 0개 이상 반복됨을 의미
더하기(+): 바로 앞에 있는 문자나 그룹이 1개 이상 반복됨
물음표(?): 바로 앞에 있는 문자나 그룹이 0개 또는 1개 나타남
중괄호({}): 바로 앞에 있는 문자나 그룹의 반복 횟수
ex) 'a{3}' = 'aaa'와 같은 의미
대괄호([]): 대괄호 안에 있는 문자 중 하나와 매칭
ex ) [abc] = 'a', 'b', 'c' 중 하나와 같음
대괄호와 하이픈([]-): 대괄호 안에 하이픈을 사용하여 범위 지정
ex) '[a-z]' = a~z 알파벳 소문자 중 하나와 같음
세미콜론(;): 여러 개의 정규식을 구분
괄호(): 괄호 안에 있는 정규식을 하나의 그룹으로 묶어 줌
2. 예제
2-1 전화번호
import re
text = "전화번호는 010-1234-5678 연락해~"
pattern = r"\d{3}-\d{4}-\d{4}"
phone_namber = re.findall(pattern, text)
print(phone_namber) # 결과 값 : ['010-1234-5678']
2-2. 이메일
import re
text = "이메일 주소 example@email.com 이야. 연락줘"
pattern = r"[a-zA-Z0-9._+-]+@[a-zA-Z0-9]+\.[a-zA-Z]{2,4}"
email = re.findall(pattern, text)
print(email) # 결과 값 : ['example@email.com']
2-3. 숫자 출력
import re
text = "이 문장에서 123456 숫자를 찾아보세요."
pattern = r"\d+"
number = re.findall(pattern, text)
print(number) # 결과 값 : ['123456']
2-4. 공백제거
import re
text = " 이 글에서 공백 제거해봐 ㅋㅋ 메롱 "
pattern = r"\s+"
is_text = re.sub(pattern, "", text)
print(is_text) # 결과 값 : '이글에서공백제거해봐ㅋㅋ메롱'
2-5. URL 출력
import re
text = "내 블로그 주소는 https://urame.tistory.com/임, 알겠지?? "
pattern = r"https?://(?:[-\w]+\.)?([-\w]+\.[\w]+)(?:/[\w-./?%&=]*)?"
my_url = re.findall(pattern, text)
print(my_url) # 결과 값 : ['urame.tistory.com']
2-6 주민번호 패턴
import re
pattern = r'\d{6}-\d{7}'
text = '내 주민번호는 123456-1234567 !!!.'
result = re.findall(pattern, text)
print(result) # 결과 값 : 123456-1234567
2-7. 스마트 팩토리 센서 ID 파싱 ( 나만을 위한... 정규식.... )
import re
tag_string = "TAG['ID_123']"
id_pattern = r"TAG\['(\w+)'\]" # ID 값을 추출하는 정규식 패턴
tag_id = re.findall(id_pattern, tag_string)
print( tag_id ) # 결과 값 : ID_123
일단 이정도 예제를 만들어 보았다.
일단 예제가 다 re.findall() 문법으로 만들었다.
하지만, import re는 다양한 문법이 있다.
re.search(): 문자열에서 정규식과 매칭되는 첫번째 부분을 찾아서 match 객체 반환. ( 없으면 None )
re.match(): 문자열의 처음부터 정규식과 매칭되는 부분을 찾아서 match 객체 반환. (없으면 None)
re.findall(): 문자열에서 정규식과 매칭되는 모든 부분을 찾아서 리스트로 반환( 없으면 빈 리스트[] )
re.finditer(): 문자열에서 정규식과 매칭되는 모든 부분을 찾아서 match 객체들을 포함한 iterator 객체를 반환
re.sub(): 문자열에서 정규식과 매칭되는 부분을 다른 문자열로 치환
원하는 문법이 있으면 찾아 쓰길 바란다. ㅎㅎ
만약, 이 예제 말고 필요한 정규식 예제가 있으면, 예제를 만들어 올려 보겠다.
'it' 카테고리의 다른 글
우분투(ubuntu)에서 Apache Ignite 설치 및 인메모리(inmemory) 설정, 그리고 캐시(cache) 데이터 샘플 (0) | 2023.03.27 |
---|---|
우분투(ubuntu) 하둡(hadoop) 설치 가이드 (0) | 2023.03.26 |
Python 웹(frontend) 만들기 ( with pynecone ) (0) | 2023.03.23 |
Redis 데이터 백업, 디스크 저장 방법 ( AOF, RDB, 스냅샷 ) (0) | 2023.03.21 |
REDIS로 IOT 데이터 처리 및 관리- ( XRANGE ) (0) | 2023.03.20 |