정규표현식
간단하게 문자열을 찾을 수 있게 해주는 표현식이다.
사용하려면 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 |
댓글