본문 바로가기
Aiffel/Fundamental

정규표현식

by EDGE-AI 2021. 12. 29.

정규표현식 (Regular expressions) 은 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어이다. 복잡한 문자열의 검색과 치환을 위해 사용되며, Python 뿐만 아니라 문자열을 처리하는 모든 곳에서 사용된다.

import re

sent = 'I can do it'
pattern = re.sub('I', 'You', sent)
pattern

>> 'You can do it'

 

Compile()

  • 찾고자 하는 문자열의 패턴 정의
  • 정의된 패턴과 매칭되는 경우에 대한 처리
pattern = re.compile('the')

pattern.findall('of the people, for the people, by the people')

>>['the','the','the']

compile 없이 한줄로도 처리 가능

re.findall('the', 'of the people, for the people, by the people')

>> ['the','the','the']

코드는 간결하지만 패턴 객체를 반복적으로 사용할 때는 compile이 더 편리

 

Methods

  • search() : 일치하는 패턴 찾기(MatchObject 반환)
  • match() : search()와 비슷하지만, 처음부터 패턴이 검색대상과 일치해야함
    • group() : 실제 결과에 해당하는 문자열 반환(search, match에서 사용)
  • findall() : 일치하는 모든 패턴 찾기(리스트 반환)
  • split() : 패턴으로 나누기
  • sub() : 일치하는 패턴으로 대체하기
src = 'My name is...'
regex = re.match('My', src)
print(regex)

>> <re.Match object; span=(0, 2), match="My">

if regex:
	print(regex.group())
else:
	print('No!')
    
>> My

 

Pattern : 특수 문자, 메타 문자

  • [ ] : 문자
  • - : 범위
  • . : 하나의 문자
  • ? : 0회 또는 1회 반복
  • * : 0회 이상 반복
  • + : 1회 이상 반복
  • {m, n} : m ~ n
  • \d : 숫자, [0-9]와 동일
  • \D : 비 숫자, [^0-9]와 동일
  • \w : 알파벳 문자 + 숫자 + _, [a-zA-Z0-9_]와 동일
  • \W : 비 알파벳 문자 + 비숫자, [^a-zA-Z0-9_]와 동일
  • \s : 공백 문자, [ \t\n\r\f\v]와 동일
  • \S : 비공백 문자, [^ \t\n\r\f\v]와 동일
  • \b : 단어 경계
  • \B : 비 단어 경계
  • \t : 가로 탭(tab)
  • \v : 세로 탭(vertical tab)
  • \f : 폼 피드
    • 프린터에 보내면 연속용지가 다음 페이지의 시작 부분으로 넘겨진다
  • \n : 라인 피드(개행 문자)
    • 커서의 위치를 아랫줄로 이동시킨다
  • \r : 캐리지 리턴(원시 문자열)
    • 인쇄 위치 또는 커서 표시 위치를 같은 줄(행) 맨 앞의 위치로 복귀한다

예제

1. 연도 찾기

text = """
The first season of America Premiere League  was played in 1993. 
The second season was played in 1995 in South Africa. 
Last season was played in 2019 and won by Chennai Super Kings (CSK).
CSK won the title in 2000 and 2002 as well.
Mumbai Indians (MI) has also won the title 3 times in 2013, 2015 and 2017.
"""

pattern = re.compile("[1-2]\d\d\d")
#1000 ~ 2999 사이의 연도 검색
pattern.findall(text)

>> ['1993', '1995', '2019', '2000', '2002', '2013', '2015', '2017']

2. 전화번호 찾기

phone_number = re.compile(r'\d\d\d-\d\d\d\d-\d\d\d\d')
# phone_number = re.compile(r'\d{3}-\d{4}-\d{4}') 
phone = phone_number.search('This is my phone number 010-1234-5678')
if phone:
	print(phone.group())
    
print('----')
phone = phone_number.match('This is my phone number 010-1234-5678')
if phone:
	print(phone.group())
    
    
>> 010-1234-5678
>> ----

match의 경우는 시작에 있지 않기 때문에 출력하지 않는다.

 

3. 이메일 찾기

pattern = re.compile("[0-9a-zA-Z]+@[0-9a-z]+\.[0-9a-z]+")
text = 'Please send a e-mail to akdien233@gmail.com or akdien233@naver.com'

pattern.findall(text)

>> ['akdien233@gmail.com','akdien233@naver.com']

 

 

참고문헌

https://nachwon.github.io/regular-expressions/

https://zerry82.tistory.com/20

'Aiffel > Fundamental' 카테고리의 다른 글

XML 파일  (0) 2021.12.29
파이썬 모듈 및 패키지 개념 정리  (0) 2021.12.29
Markdown 작성하기  (0) 2021.12.28
Linux 명령어 모음  (0) 2021.12.28
부동소수점, 고정소수점  (0) 2021.12.28

댓글