본문 바로가기
Python/PY4E

PY4E Chapter 11. Regular Expressions

by 전자여우 2022. 8. 9.

정규표현식

간단하게 문자열을 찾을 수 있게 해주는 표현식이다.

사용하려면 import re를 입력해서 정규식 라이브러리를 가져와야 한다.

 

re.search()

문자열의 find(), startswith() 메서드와 비슷한 역할을 하지만 하려는 작업마다 일일이 메서드를 바꾸지 않아도 되기에 편안하다.

# find()
hand = open('mbox-short.txt')
for line in hand:
	line = line.rstrip()
    if line.find('From:') >= 0:
    	print(line)

# re (find)
import re

hand = open('mbox-short.txt')
for line in hand:
	line = line.rstrip()
    if re.search('From:', line):
    	print(line)
        
# startswith()
hand = open('mbox-short.txt')
for line in hand:
	line = line.rstrip()
    if line.startswith('From:')
    	print(line)
        
# re (startswith)
import re

hand = open('mbox-short.txt')
for line in hand:
	line = line.rstrip()
    if re.search('^From:', line):
    	print(line)

 

re.findall()

조건에 맞는 모든 내용을 추출해서 리스트의 형태로 반환하며, 그것이 없다면 빈 리스트를 반환한다.

import re
x = 'My 2 favorite numbers are 19 and 42'
y = re.findall('[0-9]+',x)
print(y) # ['2', '19', '42']

 

Greedy Matching

정규표현식에는 가능한 문자열이 여러 개 있을 때 그중 가장 긴 것을 출력하는 습성이 있으며, 우리는 이것을 제어해줄 필요가 있다.

탐욕을 제어하는 방법은 몇 가지가 있는데 그중 가장 간단한 방법은 기호 뒤에 물음표를 붙여주는 것이다.

import re
x = 'From: Using the : character'
y = re.findall('^F.+:', x)
print(y) # From: Using the:

# Non-Greedy Matching
import re
x = 'From: Using the : character'
y = re.findall('^F.+?:', x)
print(y) # From:

 

정규표현식의 활용

# Spam Confidence Maximum
import re
hand = open('mbox-short.txt')
numlist = list()
for line in hand:
	line = line.rstrip
    stuff = re.findall('^X-DSPAM-Confidence: ([0-9.]+)', line)
    if len(stuff) != 1 : continue
    num = float(stuff[0])
    numlist.append(num)
print('Maximum:', max(numlist))

 

탈출 문자

import re
x = 'We just received $10.00 for cookies.'
y = re.findall('\$[0-9.]+', x) # $기호를 기준으로 찾고 싶기에 백슬래시로 기능을 잃게 한다.
print(y) # ['$10.00']

 

정규표현식 Cheat sheet

^ 줄의 시작과 매치(Matches the beginning of a line)
$ 줄의 끝과 매치(Matches the end of the line)
. 어떠한 문자와 매치(Matches any character)
\s 공백과 매치(Matches whitespace)
\S 공백이 아닌 것과 매치(Matches any non-whitespace character)
* 0번 이상 연속되는(Repeats a character zero or more times)
*? *의 논 그리디(Repeats a character zero or more times (non-greedy))
+ 1번 이상 연속되는(Repeats a character one or more times)
+? +의 논 그리디(Repeats a character one or more times (non-greedy))
[aeiou] 리스트 안에 들어있는 글자들과 매치(Matches a single character in the listed set)
[^XYZ] 리스트 안에 들어있는 글자가 아닌 것들과 매치(Matches a single character not in the listed set)
[a-z0-9] 범위 안의 글자들(The set of characters can include a range)
( 여기부터 추출(Indicates where string extraction is to start)
) 여기까지 추출(Indicates where string extraction is to end)

 

Assignment

Regular Expressions의 assignment에서는 링크의 txt 파일을 저장한 뒤, 모든 숫자를 추출하고 숫자의 합을 계산하는 프로그램을 작성하고 실행시킨 뒤 그 결과를 입력하는 것이었다.

나의 풀이는 다음과 같다.

# 11_re
import re
h = open('py4e-data.txt')
num = list()

for line in h:
    line = re.findall('[0-9]+', line)
    for n in line:
        n = int(n)
        num.append(n)

print(sum(num))

'Python > PY4E' 카테고리의 다른 글

PY4E Chapter 10. Tuples  (0) 2022.08.08
PY4E Chapter 9. Dictionaries  (0) 2022.08.08
PY4E Chapter 8. Lists  (0) 2022.08.08
PY4E Chapter 7. Files  (0) 2022.08.07
PY4E Chapter 6. Strings  (0) 2022.08.05

댓글