티스토리 뷰
서론
정규식은 패턴이 정해진 문자열을 손쉽게 처리할 수 있는 좋은 도구입니다. 파이썬에서는 re
패키지를 통해 사용할 수 있습니다. 간단한 사용법을 소개합니다.
본론
사용방법
파이썬에서 re 패키지로 정규표현식을 사용하는 경우 패턴 문자열을 내부 형식으로 변환하는 과정이 존재합니다. 그래서 자주 사용해야 하는 패턴은 compile
메서드를 통해 내부 형식으로 만들어진 객체를 재사용하는 것이 효율적입니다.
괄호
대괄호
[ ]
대괄호는 문자 집합을 의미합니다. [0-9]는 0부터 9까지의 숫자 집합이라고 할 수 있습니다.
자주 사용하는 문자집합은 미리 정해진 기호를 통해 사용할 수 있습니다.
기호 | 대응 | 설명 |
---|---|---|
\w | [a-zA-Z0-9_] | 모든 문자 |
\d | [0-9] | 숫자 |
\s | [ \t\n\r\f\v] | 여백 |
. | [a-zA-Z] | 문자 |
- 대문자로 변경하면 부정의 의미로 사용됩니다.
중괄호
{ }
중괄호는 문자의 반복을 의미합니다. c{m, n}은 c라는 문자가 m개 이상 n개 이하인 경우라고 할 수 있습니다.
반복 횟수에 따라 이미 정의된 기호를 사용할 수도 있습니다.
기호 | 대응 | 설명 |
---|---|---|
* | {0, n} | 0회 이상의 반복 |
+ | {1, n} | 1회 이상의 반복 |
? | {0, 1} | 0회 혹은 1회 |
소괄호
( )
소괄호는 캡처 그룹을 지정하는 데 사용합니다. 패턴 중간에 소괄호로 묶인 패턴이 존재하면 해당 패턴을 저장합니다.
만약 저장이 필요하지 않다면 (?: ...)
을 사용하여 비캡처 그룹으로 사용할 수 있습니다.
import re
text = "12:34"
pattern = r'(?:\d{2}):(\d{2})'
match = re.match(pattern, text)
if match:
# print("Hours:", match.group(1)) hours를 캡처하지 않았기 때문에 원하는 값이 나오지 않습니다.
print("Minutes:", match.group(1))
기타 기호
기호 | 대응 | 설명 |
---|---|---|
a | b | or |
\ | escapes | 특수 기호를 대응시키기 위함 |
자세하게 알고 싶다면 re 공식문서에서 확인하는 것이 가장 좋습니다.
사용 예시
예시 텍스트가 아래와 같을 때 [진통, 14:00 ~ 14:30]
과 같은 패턴만을 매칭하도록 정규식을 만들어보겠습니다.
[실험내용]
어쩌구 저쩌꾸
[기타]
바우와우
[배고픔, 14:00 ~ 14:30]
[낮잠, 16:00 ~ 16:35]
패턴
- 대괄호는 특수기호이기 때문에 매칭을 위해서는 백슬래시()를 이용해 표시해주어야 합니다.
- 두 부분 중, 앞부분은 모든 문자를 다 매칭하고 글자수의 제한이 없으므로
\w+
로 나타낼 수 있습니다. - 뒷부분은 시간을 나타냅니다. 시(hour)는 0부터 23까지의 수이고 분(minute)은 0부터 59로 나타낼 수 있으므로 or기호 (|)를 이용해 제한할 수 있습니다.
hour: [0-1]\\d | 2\[0-3]
,minute: [0-5]\\d
- 여백문자는
\s*
로 적절하게 처리해줍니다.
이 패턴들을 조합해 하나의 식을 만들어 보겠습니다.
pattern = r'\[(\w+),\s*([0-1]\d|2[0-3]):([0-5]\d)\s*~\s*([0-1]\d|2[0-3]):([0-5]\d)\]'
결과
import re
text = """
[실험내용]
어쩌구 저쩌꾸
[기타]
와우바우
[배고픔, 14:00~14:30]
[낮잠, 16:00~16:35]
"""
pattern = r'\[(\w+),\s*([0-1]\d|2[0-3]):([0-5]\d)\s*~\s*([0-1]\d|2[0-3]):([0-5]\d)\]'
matches = re.findall(pattern, text)
for match in matches:
print(match)
('배고픔', '14', '00', '14', '30')
('낮잠', '16', '00', '16', '35')
성공적으로 추출된 것을 확인해볼 수 있습니다.
결론
패턴을 표현하는 새로운 방법을 알게 되었습니다. if문을 남발하는 것 보다는 훨씬 좋은 선택지 같습니다. 다른 프로그래밍 언어에서도 정규표현식이 항상 존재하는 만큼 배워두면 좋은 것 같습니다.
'개발자 > 파이썬(Python)' 카테고리의 다른 글
[Django] ViewSet에서 action마다 다른 permission 적용하기 (0) | 2024.02.20 |
---|---|
[Django] DRF로 Token 로그인 구현 (0) | 2024.02.16 |
[Django] Docker 배포 시 CSRF 검증에 실패했습니다. 해결방법 (0) | 2024.01.22 |
[Django] 조건부 CBV 만들기 (0) | 2024.01.19 |
[Django] Docker 컨테이너에서 createsuperuser 사용 (0) | 2024.01.17 |