EunGyeongKim

[Python] 정규 표현식 본문

코딩테스트/programmers

[Python] 정규 표현식

EunGyeongKim 2022. 9. 20. 10:44
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)

 

 

 

Comments