Python

정규식(regular expression)

왕초보코딩러 2024. 4. 15. 14:09
728x90

re모듈을 통해 사용

import re

문자열에 대한 연산에 사용. 문자열 패턴 표현, 문자열 수정, 분할

 

많이 쓰는 패턴

패턴 설명
^패턴 이 패턴으로 시작해야 함
패턴$ 이 패턴으로 끝나야 함
패턴1|패턴2 두 패턴 중 하나
. 줄바꿈(\n)을 제외한 모든 문자 한 개
{숫자}
{숫자,}
{숫자1,숫자2}
{숫자}일 때 숫자 만큼 반복
{숫자,}일 때 숫자 이상 반복
{숫자1, 숫자2}일 때 숫자1 이상 숫자2 이하 반복
* 0번 이상 반복 = {0,}
+ 1번 이상 반복 = {1,}
? 하나 있거나 없어야 함 = {0,1}

 

* + ? {} 정규식의 매치 결과는 매우 탐욕스러워서 매치할 수 있는 최대한의 문자열을 반환한다.
-> 방지를 위해 ?를 사용

Greedy(최대한 많이 반환) Lazy(최대한 적게 반환)
* *?
+ +?
? ??
{} {}?

https://velog.io/@commitnpush/Greedy-Lazy

 

정규 표현식의 Greedy & Lazy

정규 표현식에서 Quantifier (수량자)의 greedy & lazy

velog.io

 

() 그룹화 

(패턴) 괄호 안의 해당 내용만 캡쳐
(패턴1) (패턴2) 순서대로 그룹1, 그룹2, ..
(?:패턴) 캡쳐에서 제외하겠다

 

[] 패턴 한 글자 찾기

[문자들] []안에 들어있는 문자들 중 하나
[^문자들] []에 들어있는 문자들 제외 문자 하나
[문자1-문자2] 문자1과 문자2 사이의 문자 중 하나

 

 

알파벳  -> [A-z] / [A-Za-z]

한글 -> [가-힣]

숫자 -> [0-9]

 

Character Class

소문자와 대문자는 반대라고 생각하면 된다

\d 숫자 1
\D 숫자가 아닌 값 1
\s 공백 1
\S 공백이 아닌 값 1
\w 알파벳 또는 숫자 또는 _ 1
\W 알파벳이나 숫자가 또는 _이 아닌 값 1

 

Regular expression function

1. search(패턴, 문자열): 문자열 전체에서 패턴 존재하는지 검사. 결과가 없으면 None 반환. 1개만 찾음

2. match(패턴, 문자열): 문자열 시작부터 매치 검사. 매칭 결과가 없으면 None 반환

3. findall(패턴, 문자열): 문자열에서 패턴을 만족하는 문자열의 리스트 반환

4. sub(패턴, 교체할 문자열, 문자열): 문자열에서 패턴과 일치하는 부분을 교체

5. split(패턴, 문자열): 지정된 패턴 부분에서 문자열 나눔

6. compile(패턴): 패턴을 컴파일하여 정규식 객체로 반환

 

re.compile 시 옵션

re.IGNORECASE -> 대소문자 구분 안함
re.MULTILINE -> 여러 줄에 적용

 

 

re.search에 그룹화를 하면 group() 사용 가능

groups() 그룹들을 튜플로 리턴
group() 매치되는 전체 문자열 리턴( group(0)과 동일)
group(n) 캡쳐된 n번째 그룹 문자열 리턴
(?:)는 제외

 

data = '홍길동 040312-3858498'

 

https://greeksharifa.github.io/%EC%A0%95%EA%B7%9C%ED%91%9C%ED%98%84%EC%8B%9D(re)/2018/07/28/regex-usage-04-intermediate/ 

 

Python, Machine & Deep Learning

Python, Machine Learning & Deep Learning

greeksharifa.github.io

 

re.sub에서 그룹화 한 것 사용하는 법

\g<1>
\1

# 주민번호 마스킹 하기
# \g<1>과 \1과 같다
masking = re.sub(r'(.+)\s(\d{6})-(\d{7})', r'\g<2>-******* \g<1>', data)
#masking = re.sub(r'(.+)\s(\d{6})-(\d{7})', r'\3-******* \1', data)

print(f"마스킹 전: {data}")
print("마스킹 후 : {masking}")
마스킹 전: 홍길동 040312-3858498
마스킹 후 : 3858498-******* 홍길동

 

핸드폰 번호 예제

# 핸드폰 번호 형식
num = '''
01043598496
010-4395-2343
02-324-3453
080-335-0020
023243566
'''
re.findall(r'\d{2,3}-?\d{3,4}-?\d{4}', num)
['01043598496', '010-4395-2343', '02-324-3453', '080-335-0020', '023243566']

 

 

테스트를 할 수 있는 곳

https://regexr.com/

 

RegExr: Learn, Build, & Test RegEx

RegExr is an online tool to learn, build, & test Regular Expressions (RegEx / RegExp).

regexr.com

 

도움:

https://docs.python.org/ko/3/library/re.html

 

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

 

https://youtu.be/dTDoTR0MXjU

 

https://wikidocs.net/46744

 

03.99. 정규표현식(Regular Expression)

정규표현식(regular expression)은 줄임말로 **정규식**이라고도 한다. 정규식은 **특정 문자열의 패턴을 표현하는 식**으로, 문자열 처리함수를 시용하는 것보다 …

wikidocs.net