일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- python 갯수세기
- 에러해결
- Scienceplots
- Mae
- MAPE
- n_neighbors
- 파이썬을파이썬답게
- 평가지표
- TypeError
- Python
- Pycaret
- 프로그래머스
- KAKAO
- 코테
- iNT
- PAPER
- RMES
- Tire
- mMAPE
- Alignments
- 카카오
- Overleaf
- 논문작성
- n_sample
- knn
- 논문
- mes
- SMAPE
- 스택
- 논문editor
- Today
- Total
EunGyeongKim
[Python] 정규 표현식 본문
import re
# 정규식 객체 생성
p = re.compile('[a-z]+')
#문자열의 처음부터 정규식과 매치되는지 조사
m = p.match("python")
print(m)
# <re.Match object; span=(0, 6), match='python'>
#"python" 문자열은 [a-z]+ '3'이 정규식에 부합
m = p.match("3 python")
print(m)
# None 출력
프로그래머스 문제(문제 링크)를 풀다가 파이썬에서도 정규표현식이 있다는것을 알게 되어 내용을 정리한다.
정규식(正規式)은 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어이며, 그 식을 표현한 것을 정규표현식(正規表現式, regular expression)이라고 한다.
출처: 위키백과
주로 문자열의 검색, 치환을 위해 지원된다.
파이썬은 re 모듈을 써서 활용되며 메타문자를 써서 문자열의 패턴을 찾을 수 있다.
<메타문자>
. ^ $ * + ? \ | ( ) { } [ ]
메타 문자의 의미와 사용법
1. [ ] : [ ]사이의 문자들과 매치
\d | 숫자와 매치 | [0-9] |
\D | 숫자가 아닌것과 매치 | [^0-9] |
\s | whitespace 문자와 매치 | [ \t\n\r\f\v] |
\S | whitespace 문자가 아닌것과 매치 | [^ \t\n\r\f\v] |
\w | 문자+숫자와 매치 | [a-zA-Z0-9_] |
\W | 문자+숫자가 아닌 문자와 매치 | [^a-zA-Z0-9_] |
* 정규 표현식이 [cat]이라면 c,a,t중 한개의 문자와 매치를 뜻함
-> "hello world" : c,a,t중 어느하나도 포함 X
-> "pencil" : c와 매치
-> "tall" : t와 매치
* [ ] 안의 두 문자 사이에 하이픈(-)을 사용하면 두문자 사이의 범위를 의미
-> a-z : a에서 z사이의 문자
-> 0-9 : 숫자
* ^는 반대의 의미
-> [^0-9] : 숫자가 아닌 문자
-> [^a-d] : a~d가 아닌 문자
2. Dot(.) : 모든 문자들과 매체
a.b
위 정규식의 의미는 다음과 같다.
"a + 모든문자 + b"
즉 a와 b라는 문자 사이에 어떤 문자가 들어가도 모두 매치된다는 의미
하지만
a[.]b
이 정규식의 의미는 다음과 같다.
"a + Dot(.)문자 + b"
따라서 정규식 a[.]b는 "a.b" 문자열과 매치되고, "a0b" 문자열과는 매치되지 않는다.
※ 만약 앞에서 살펴본 문자 클래스([]) 내에 Dot(.) 메타 문자가 사용된다면 이것은 "모든 문자"라는 의미가 아닌 문자 . 그대로를 의미
3-1. *: 반복
ca*t
이 정규식에는 반복을 의미하는 * 메타 문자가 사용되었다. 여기에서 사용한 *은 * 바로 앞에 있는 문자 a가 0부터 무한대로 반복될 수 있다는 의미
다음과 같은 문자열이 모두 매치된다.
정규식 | 문자열 | Match | 설명 |
ca*t | ct | Yes | "a"가 0번 반복되어 매치 |
ca*t | cat | Yes | "a"가 0번 이상 반복되어 매치 (1번 반복) |
ca*t | caaat | Yes | "a"가 0번 이상 반복되어 매치 (3번 반복) |
3-2. +: 반복
+는 최소 1번 이상 반복될 때 사용한다. 즉 *가 반복 횟수 0부터라면 +는 반복 횟수 1부터 시작
정규식을 보자.
ca+t
위 정규식의 의미는 다음과 같다.
"c + a(1번 이상 반복) + t"
위 정규식에 대한 매치여부는 다음 표와 같다.
정규식문자열Match 여부설명
ca+t | ct | No | "a"가 0번 반복되어 매치되지 않음 |
ca+t | cat | Yes | "a"가 1번 이상 반복되어 매치 (1번 반복) |
ca+t | caaat | Yes | "a"가 1번 이상 반복되어 매치 (3번 반복) |
3-3. ({m,n},?) : { } 메타 문자를 사용하면 반복 횟수를 고정하여 반복
- {m} : m번은 반드시 반복
ca{2}t
위 정규식의 의미는 다음과 같다.
"c + a(반드시 2번 반복) + t"
- {m, n} : {3,}처럼 사용하면 반복 횟수가 3 이상인 경우이고 {,3}처럼 사용하면 반복 횟수가 3 이하를 의미
ca{2,5}t
위 정규식의 의미는 다음과 같다:
"c + a(2~5회 반복) + t"
- ? : {0,1}과 같은 의미. 있어도 되고, 없어도 됨
ab?c
정규식을 이용한 문자열 검색
이제 컴파일된 패턴 객체를 사용한 문자열 검색
match() | 문자열의 처음부터 정규식과 매치되는지 조사한다. |
search() | 문자열 전체를 검색하여 정규식과 매치되는지 조사한다. |
findall() | 정규식과 매치되는 모든 문자열(substring)을 리스트로 돌려준다. |
finditer() | 정규식과 매치되는 모든 문자열(substring)을 반복 가능한 객체로 돌려준다. |
match() 예제
import re
# 정규식 객체 생성
p = re.compile('[a-z]+')
#문자열의 처음부터 정규식과 매치되는지 조사
m = p.match("python")
print(m)
# <re.Match object; span=(0, 6), match='python'>
#"python" 문자열은 [a-z]+ '3'이 정규식에 부합
m = p.match("3 python")
print(m)
# None 출력
search() 예제
import re
# 정규식 객체 생성
p = re.compile('[a-z]+')
#문자열의 처음부터 정규식과 매치되는지 조사
m = p.search("3 python")
print(m)
# <re.Match object; span=(2, 8), match='python'>
findall() 예제
import re
# 정규식 객체 생성
p = re.compile('[a-z]+')
#문자열의 처음부터 정규식과 매치되는지 조사
result = p.findall("life is too short")
print(result)
# ['life', 'is', 'too', 'short'] 출력
finditer() 예제
import re
# 정규식 객체 생성
p = re.compile('[a-z]+')
m = p.finditer("life is too short")
for r in result: print(r)
# <re.Match object; span=(0, 4), match='life'>
# <re.Match object; span=(5, 7), match='is'>
# <re.Match object; span=(8, 11), match='too'>
# <re.Match object; span=(12, 17), match='short'>
정규식을 이용한 예제
[2019 kakao] 튜플
[2019 kakao] 튜플
더 많은 코드 (https://github.com/EunGyeongKim/TIL) GitHub - EunGyeongKim/TIL: Today I Learne Today I Learne. Contribute to EunGyeongKim/TIL development by creating an account on GitHub. github.com..
eungyeong-kim.tistory.com
Reference
점프 투 파이썬 (https://wikidocs.net/4308)
'코딩테스트 > programmers' 카테고리의 다른 글
[월간코드] n^2 배열 자르기 (0) | 2022.09.20 |
---|---|
[연습문제]JadenCase 문자열 만들기 (1) | 2022.09.20 |
[2019 kakao] 튜플 (0) | 2022.09.19 |
[연습문제] 최댓값과 최솟값 (0) | 2022.09.19 |
[2022 kakao] k진수에서 소수 개수 구하기 (0) | 2022.09.18 |