본문 바로가기
Python/기초

[파이썬/Python] 문제를 풀며 정규 표현식 연습하기 기초편

by 모두의 케빈 2023. 7. 15.

저는 개인적으로 정규 표현식은 연습 문제를 풀면서 공부하는 것이 가장 좋다고 생각합니다. 이번 시간에는 연습 문제를 제공해 주는 사이트의 문제를 하나씩 풀면서 메타 문자를 활용하는 연습을 진행하겠습니다. (참고로 모든 문제를 리뷰하지는 않고, 도움이 될 만한 문제만 선정하여 리뷰할 예정입니다.)

연습 문제 사이트는 여기를 참고해 주시고, 메타 문자 표는 여기를 참고해 주세요. 

 

정규 표현식 연습 문제와 파이썬 코드


 

문제 1 : 조커 카드 dot(.)과 문자열의 끝 확인($)

출처: RegexOne - Learn Regular Expressions - Lesson 2: The Dot

 

위의 세 개의 문자열은 매치하고 마지막 문자열인 abc1은 제외하는 정규 표현식을 작성해 보겠습니다. 먼저 규칙을 살펴보면 위의 세 개의 문자열은 마침표로 끝나고 마지막 문자열은 마침표가 없습니다. 여기서 '문자열의 마지막은 마침표(.)로 끝나야 한다.'라는 첫 번째 규칙을 얻을 수 있습니다.

그리고 마침표 앞의 세 개의 글자는 특수 문자, 숫자, 문자로 공통점이 없으니 이들 모두를 표현할 수 있는 조커 카드인 dot(.)을 사용하여 표현하겠습니다. dot(.)은 줄 바꿈 문자(\n)를 제외한 모든 문자를 표현할 수 있습니다.

따라서 정답은 임의의 3개 문자와 마침표로 끝나는 문자열"을 정규 표현식으로 표현해야 하므로,  ...\. 입니다.

이를 파이썬 코드로 구현하면 아래와 같습니다.

sample_str = """cat.
896.
?=+.
abc1"""

p = re.compile('...\.')
print(p.findall(sample_str))


# 위 코드의 실행 결과
['cat.', '896.', '?=+.']

 

문제 2: 문자열을 담는 메타 문자 대괄호

출처: RegexOne - Learn Regular Expressions - Lesson 3: Matching specific characters

 

위의 세 문자열은 찾아야 하고, 아래 세 문자열은 검색에서 제외해야 합니다. 메타 문자 중에서 '한 개'의 문자를 의미하는 대괄호([ ])를 활용하여 풀 수 있습니다. 대괄호 안에 여러 개의 문자를 입력하면 각각 '또는(or)'의 개념이 들어갑니다.

정답 문자열의 규칙은 첫 번째 문자가 c 또는 m 또는 f이고 나머지 두 개의 문자는 'an'이면 됩니다. 이를 정규 표현식으로 표현하면 [cmf]an이 됩니다. 

이를 파이썬 코드로 구현하면 아래와 같습니다.

sample_str = """can
man
fan
dan
ran
pan"""

p = re.compile('[cmf]an')
print(p.findall(sample_str))

# 위 코드의 결과값
['can', 'man', 'fan']

 

 

문제 3: 부정 메타 문자 (^)

출처: RegexOne - Learn Regular Expressions - Lesson 4: Excluding specific characters

 

풀이 방법은 두 가지입니다. 첫 번째 글자가 'b'가 아니고 뒤의 두 글자가 'og'라는 규칙으로 풀 수 있고, 첫 번째 글자가 h 또는 d이고 뒤의 두 글자가 'og'라는 규칙으로도 풀 수 있습니다.

후자는 '문제 2'와 동일하므로 직접 연습해 보시고요. 저는 전자로 풀겠습니다. '^'는 부정을 의미하는 메타 문자입니다. 따라서 [^b]og 라고 하면 전자의 규칙이 되는 것입니다.

sample_str = """hog
dog
bog
"""

p = re.compile('[^b]og')
print(p.findall(sample_str))

# 위 코드의 결과값
['hog', 'dog']

 

 

문제 4: 하이픈(-)과 대괄호([ ])의 조합

하이픈은 범위를 나타냅니다. 대괄호([ ])와 함께 사용하면 다음을 표현할 수 있습니다.

"모든 대문자 [A-Z], 모든 소문자 [a-z], 모든 숫자 [0-9]"

출처: RegexOne - Learn Regular Expressions - Lesson 5: Character ranges

 

위의 세 문자열은 첫 번째 글자가 대문자로 시작합니다. 따라서 아래의 정규 표현식을 활용할 수 있습니다.

"첫 번째 글자가 A~Z 사이의 대문자이고 뒤에 두 개의 문자" (정규 표현식: [A-Z]..)

거꾸로 [a-z]를 하게 되면 아래 세 개의 문자열이 선택됩니다. 소문자니까요. 숫자 [0-9]에 대해서는 직접 실습해 보시기 바랍니다.

파이썬 코드는 아래와 같습니다.

sample_str = """Ana
Bon
Cpc
aax
bby
ccz
"""

p = re.compile('[A-Z]..')
print(p.findall(sample_str))

# 위 코드의 결과값
['Ana', 'Bon', 'Cpc']

 

 

문제 5: 문자의 반복을 표현하는 중괄호 {min, max}

메타 문자 중괄호는 중괄호 바로 앞의 문자가 몇 번 반복되는지를 표현하는 규칙입니다. 

출처: RegexOne - Learn Regular Expressions - Lesson 6: Catching some zzz's

위의 두 개의 문자열은 각각 z가 5번, 3번 반복됩니다. 중괄호를 활용하여 정규 표현식을 다음과 같이 정의할 수 있습니다.

"처음 두 글자가 wa이면서 z가 최소 3번, 최대 5번 반복되고 마지막 두 글자는 up" (정규 표현식: wa{3,5}up

"처음 두 글자가 wa이면서 z가 2번 이상 반복되고 마지막 두 글자는 up" (정규 표현식: wa{2,}up

이처럼 중괄호의 min과 max는 생략될 수 있습니다. 

sample_str = """wazzzzzup
wazzzup
wazup
"""

p = re.compile('waz{2,}up')
print(p.findall(sample_str))

# 위 코드의 결과값
['wazzzzzup', 'wazzzup']

 

 

문제 6: 최소 1번 이상 반복(+)과 최소 0번 이상 반복(*)

덧셈 기호(+)는 바로 앞의 문자가 최소 1번 이상 반복되는 경우를 의미합니다. 곱셈 기호(*)는 바로 앞의 문자가 최소 0번, 즉 없거나 반복되거나를 표현할 수 있습니다.

출처: RegexOne - Learn Regular Expressions - Lesson 7: Mr. Kleene, Mr. Kleene

 

아래의 정규 표현식 규칙을 활용할 수 있습니다. 대괄호는 '한 개'의 문자를 담는 것을 기억하세요.

"a가 2번 이상 반복되고 뒤에는 소문자 알파벳의 반복"  (정규 표현식: a{2,}[a-z]+)

"aa가 없어도 되고, 1번 이상 반복돼도 되고 뒤에는 소문자 알파벳의 반복" (정규 표현식: aa*[a-z]+)

sample_str = """aaaabcc
aabbbbc
aacc
a
"""

p = re.compile('aa*[a-z]+')
print(p.findall(sample_str))

# 위 코드의 결과값
['aaaabcc', 'aabbbbc', 'aacc']

 

댓글