일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Class
- concurrency
- 시바견
- Protocol
- 109. Convert Sorted List to Binary Search Tree
- Generator
- t1
- DWG
- Decorator
- Regular Expression
- 컴퓨터의 구조
- LeetCode
- Python Code
- 315. Count of Smaller Numbers After Self
- 파이썬
- 프로그래머스
- 운영체제
- 43. Multiply Strings
- data science
- iterator
- 밴픽
- 30. Substring with Concatenation of All Words
- attribute
- Python Implementation
- Substring with Concatenation of All Words
- Python
- shiba
- Convert Sorted List to Binary Search Tree
- 715. Range Module
- kaggle
- Today
- Total
Scribbling
<Python> 정규표현식 본문
정규 표현식 혹은 정규식은 문자열 매칭에 매우 유용하다.
정규 표현식에 대해 자세히 알고 싶다면 아래 링크를 참고하라.
https://dojang.io/mod/page/view.php?id=2435
이 글에서는 최대한 간략하게 다루었다.
파이썬은 정규 표현식을 지원하기 위한 기본 라이브러리가 있다. (re)
re는 regular expression의 약어이며, 이 라이브러리에 대해 살펴보자.
p = re.compile('패턴 혹은 정규식') 형식으로 컴파일된 패턴 객체를 생성할 수 있다.
컴파일된 패턴 객체(p)는 아래 4가지 메서드를 제공한다.
- match(): 문자열의 처음부터 정규식과 매치되는지 확인 (매치 시 match 객체 return, 그 외 None)
- search(): 문자열 전체를 검색하여 정규식과 매치되는지 확인
- findall(): 정규식과 매치되는 모든 문자열을 리스트로 return
- finditer(): 정규식과 매치되는 모든 문자열을 반복 가능한 객체로 return
import re
p = re.compile('[a-z0-9]+')
m1 = p.match('hello')
m2 = p.match('H')
print(m1)
print(m2)
import re
p = re.compile('[a-z0-9]+')
m1 = p.findall('what the hell')
m2 = p.findall('WHAT THE FUCK')
print(m1)
print(m2)
Match 객체는 다음 네개의 메서드를 지원한다.
- group(): 매치된 문자열을 return
- start(): 매치된 문자열의 시작 위치를 return
- end(): 매치된 문자열의 끝 위치를 return
- span(): 매치된 문자열의 (시작, 끝) tuple을 return
import re
p = re.compile('[a-z0-9]+')
m1 = p.search('what the hell')
print(m1.group())
print(m1.span())
지금까지 re 라이브러리를 사용하는 방법을 다루었다.
여기서부터는 정규식 규칙을 다룬다.
1. 문자열이 맨 앞 혹은 맨 뒤에 매치되는지 확인
^문자열: 맨 앞
문자열$: 맨 뒤
p = re.compile('^[a-z0-9]+')
2. 지정된 정규식 중 하나라도 매치되는지 확인 (Or)
문자열|문자열
m = re.search('[a-z]+|[0-9]+', '11254')
3. 범위, *, +, ?, .
범위를 표현하기 위해 [ ] 를 사용한다.
*: 특정 문자(열)이 0개 이상 있는지 확인
+: 특정 문자(열)이 1개 이상 있는지 확인
?: 특정 문자(열)이 0개 혹은 1개인지 확인
.: 아무 문자(숫자) 1개가 있는지 확인
m = re.search('[0-9].[a-z]+', '3face')
4. 문자(열) 개수 확인
문자(열)의 개수 확인에는 { }를 사용한다.
{3}은 3개 있는지 확인, {7, 8}은 7~8개 있는지 확인
m = re.search('(gofish){3}', 'gofishgofishgofishgofishgofish')
5. 특정 범위 제외하기
[^범위]: 해당 범위를 제외한 문자
m = re.search('[^0-9]+', 'ㅇㅇㅇ')
6. 특수 문자 매칭
정규식에 사용되는 특수 문자 * + ? . ^ $ ( ) [ ] - 는 앞에 \를 붙여서 구별한다.
단, [ ] 안의 특수 문자는 \를 붙이지 않아도 된다.
m = re.search('\([*]*\)', '(*********)')
7. 범위 간단히 표현하기
- \d: [0-9]
- \D: [^0-9]
- \w: [a-zA-Z0-9_]
- \W: [^a-zA-Z0-9_]
- \s: [ \t\n\r\f\v]
- \S: [^ \t\n\r\f\v]
8. 그룹
패턴 안에서 정규 표현식을 ( )로 묶으면 그룹이 된다.
매칭객체.group(그룹숫자)은 매칭된 문자열을 반환한다.
m = re.match('([0-9]{3}) ([a-z]*)', '345 bbcd')
print(m.group())
print(m.group(1))
그룹 개수가 많아지면 숫자로 그룹 구분이 어렵다. 이럴 땐 그룹에 이름을 부여할 수 있다.
(?P<이름>정규표현식)
m = re.match('(?P<func>[a-zA-Z_][a-zA-Z0-9_]+)\((?P<arg>\w+)\)', 'print(3337)')
print(m.group('func'))
print(m.group('arg'))
9. 문자열 교체
re.sub 함수로 문자열 교체가 가능하다.
re.sub('패턴', '바꿀문자열' or 교체 함수, '문자열', 바꿀횟수)
print(re.sub('[0-9]+', 'n', '1 2 apple 4 be ezz 7 8'))
print(re.sub('[0-9]+', lambda m: str(int(m.group()) * 10), '1 2 dda 4 beez aab 7 8'))
그룹을 이용하면 정규표현식으로 찾은 문자열을 다시 사용가능하다.
print(re.sub('([a-z]+) ([0-9]+)', '\\2 \\1 \\2 \\1', 'hello 1234'))
print(re.sub('({\s*)"(?P<key>\w+)":\s*"(?P<value>\w+)"(\s*})', '<\\g<key>>\\g<value></\\g<key>>', '{ "name": "james" }'))
'Computer Science > Python' 카테고리의 다른 글
Python String Methods (0) | 2022.01.18 |
---|---|
Python Int Representation & Bit Operations (0) | 2022.01.13 |
<Python> Decorator (0) | 2021.11.09 |
<Python> Iterator, Generator (0) | 2021.11.09 |
<Python> Class 파헤치기 (0) | 2021.10.28 |