[Python] 정규식을 이용한 패턴 찾기
1) 텍스트에서 문자 패턴 찾기
mbox-short.txt 파일에서 'From:'이라는 문자 패턴이 포함된 문장을 찾아 출력
여기에서는 find() 메소드를 사용
import re
hand = open('mbox-short.txt')
for line in hand:
line = line.rstrip()
if line.find('From:') >= 0:
print(line)
같은 코드를 정규표현식으로 작성하면 다음과 같다.
정규표현식을 사용하기 위해서는
1. re(regular expression) 모듈을 import
2. re.search()가 find() 메소드와 같은 역할
import re
hand = open('mbox-short.txt')
for line in hand:
line = line.rstrip()
if re.search('From:', line) :
print(line)
2) 텍스트에서 시작 패턴 찾기
'From:'으로 시작하는 문장을 출력하는 프로그램
import re
hand = open('mbox-short.txt')
for line in hand:
line = line.rstrip()
if line.startswith('From:') :
print(line)
이것을 정규표현식으로 표현하려면 다음과 같이 '^'라는 특수 문자를 사용하면 된다.
^ : 시작
import re
hand = open('mbox-short.txt')
for line in hand:
line = line.rstrip()
if re.search('^From:', line) :
print(line)
3) 패턴 추출하기
'[0-9]+' 은 0부터 9까지 문자가 1번 이상 반복되는 패턴이다.
즉, 정수로 이루어진 데이터를 찾는 것
- [ ] : 대괄호 안의 문자들 중 한 개의 문자와 매치
[amk]라고 한다면 a 또는 m 또는 k 중 하나라도 존재하면 매치를 의미
[a-z]와 같이 범위를 지정할 수도 있습니다. [a-zA-Z]는 알파벳 전체를 의미하는 범위
(( 즉, 문자열에 알파벳이 존재하면, 매치를 의미)) - + : 앞의 문자가 최소 한 개 이상 존재 (문자가 1개 이상)
findall 메서드는 x(두 번째 파라미터)라는 문자열에 존재하는 패턴('[0-9]+')을 모두 리스트로 저장해주는 기능
따라서, 이 코드는 x라는 문자열에서 정수 형태의 데이터를 모두 추출하여 y에 저장을 하는 코드
import re
x = 'My 2 favorite numbers are 19 and 42'
y = re.findall('[0-9]+',x)
print(y)
# ['2', '19', '42']
다음 코드는 'A','E','I','O','U'로 이루어진 패턴('[AEIOU]+')을 찾아 출력하는 코드이지만
x 문자열에 해당되는 패턴이 없어서 빈 리스트를 출력한다.
여기서 알 수 있는 사실은 정규 표현식에서는 소문자와 대문자를 구분한다는 사실이다.
import re
x = 'My 2 favorite numbers are 19 and 42'
y = re.findall('[AEIOU]+',x)
print(y)
# [] (빈 리스트 출력)
4) 탐욕적 방식의 패턴 찾기
(일치하는 여러 패턴이 있을 경우 가장 긴 것을 선택)
만약 다음 문장에서 '^F.+:'라는 패턴과 일치하는 부분을 찾는다면,
- ^F : F로 시작하는 문자열
- . + : 하나 이상 반복
=> F로 시작하는 문자열 중에서 : 으로 끝나는 문자열 ( : 앞에 하나 이상의 임의의 문자가 있어야 함)
x = 'From: Using the : character'
- From:
- From: Using the :
이라는 두 가지 부분이 모두 패턴과 일치하게 된다.
이럴 때는 다음과 같이 가장 긴 패턴을 찾아주는데, 이것을 '탐욕적 방식의 패턴 찾기'라고 부른다.
import re
x = 'From: Using the : character'
y = re.findall('^F.+:', x)
print(y)
# ['From: Using the :']
5) 비탐욕적 방식의 패턴 찾기
다음 코드에서처럼 패턴 뒤에 '?'(물음표)를 붙여주면 여러 대상 중 가장 짧은 것을 선택하게 된다.
(( ?를 붙이면 욕심을 버릴 수 있다 ))
- ? : ? 앞의 문자가 존재할 수도 있고 존재하지 않을 수도 있는 경우
import re
x = 'From: Using the : character'
y = re.findall('^F.+?:', x)
print(y)
# ['From:']
6) 원하는 부분만 추출하기
다음 코드를 실행하면 '@' 문자 앞 뒤로 공백이 아닌 문자가 오는 문자열 패턴을 찾아준다.
'\S+@\S+'
따라서 다음과 같이 이메일 주소의 패턴이 추출된다.
x = 'From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008'
y = re.findall('\S+@\S+',x)
print(y)
# ['stephen.marquard@uct.ac.za’]
그리고 다음과 같이 From으로 시작하는 이메일 주소 패턴에서 이메일 주소 부분만 추출할 수도 있다.
소괄호를 사용해서!!!
x = 'From stephen.marquard@uct.ac.za Sat Jan 5 09:14:16 2008'
y = re.findall('^From (\S+@\S+)',x)
print(y)
# ['stephen.marquard@uct.ac.za']
'Python' 카테고리의 다른 글
2차원 리스트에서 최댓값, 최솟값 찾기 (1) | 2023.10.10 |
---|---|
Collections 모듈의 Counter (0) | 2023.10.09 |