정규 표현식은 파이썬 뿐만 아니라 모든 언어에서 사용하며, 문자열 내에서 원하는 문자만 추출하고 싶을 때 사용한다. 처음 배우기에는 러닝 커브가 있지만 한 번 배워두면 활용성이 너무 높기 때문에 꼭 배우는 것을 추천한다.
정규 표현식을 하기 위해서는 다음의 메타 문자들과 익숙해 질 필요가 있다. 각각 어떤 의미를 지니고 있는지 파악해보자.
. ^ $ * + ? \ | ( ) { } [ ]
정규 표현식의 기초
.
⇒ 일치하는 모든 문자열 (1개)
^
⇒ 시작 문자가 일치하는 경우 찾기
$
⇒ 마지막 문자가 일치하는 경우 찾기
⇒ 같은 문자열 반복
⇒ 1개 이상 같은 문자열 반복
( )
⇒ 그룹으로 묶기
{ }
⇒ 일정 갯수인 패턴 찾기
[ ]
⇒ 여러 문자들 중 1개라도 일치하는지 확인
?
⇒ 없거나 1개 이상 있을 경우 매치
\문자 : 자주 쓰는 패턴을 나타낼 때 사용
\d : [0-9]
\D : [^0-9] (즉, 숫자가 아닌 경우)
\s : 공백 문자인 경우 (\t, \n, \r인 경우)
\S : 공백 문자가 아닌 경우
\w : [a-zA-Z0-9_] (숫자 및 알파벳 문자인 경우)
\W : [^a-zA-Z0-9_] (숫자 및 알파벳 문자가 아닐 경우)
정규 표현식을 사용하기 위한 re 모듈과 메서드들
파이썬에서는 정규 표현식을 사용하기 위해서 re 모듈을 사용한다.
주로 search, match, findall, compile 등을 사용한다.
- match : 첫 문자열부터 일치하는 패턴을 찾고 싶을 때 사용
- search : 아무 곳에서나 일치하는 문자열을 찾고 싶을 때
- findall : 패턴과 일치하는 여러 문자열을 찾아 리스트에 넣고 싶을 때
- compile : 컴파일을 미리 해 두고 저장할 때 사용 (반복문 내에서 여러 번 쓴다면 컴파일 메서드를 사용하는 것이 좋다.)
1. match
코드를 설명하자면, re 모듈을 import한 후,
re 모듈의 match 메서드를 사용하여 s 문자열 내에서 'abc' 문자와 일치하는 패턴이 있는지 확인한다. 이를 m에 값을 담고, group 메서드를 사용하여 문자열을 최종 출력한다.
import re
s = 'abc1234'
m = re.match('abc', s)
print(m.group())
# 출력
abc
주의 : match 함수는 첫 문자열부터 일치해야 하며, 일치하지 않을 경우 None을 반환하기 때문에 이 부분을 유의하여야 한다.
2. search
search 메서드를 사용하여 s 문자열 내의 [a-f]{2,3}\d에 일치하는 패턴이 있는지 확인한다.
[a-f]는 abcdef 문자열 중 1개를 뜻하며 {2,3}은 2~3개를 뜻하고, \d는 digit (숫자)를 뜻한다.
import re
s = '521def1234'
m = re.search('[a-f]{2,3}\d', s)
print(m)
print(m.group())
# 출력
<re.Match object; span=(3, 7), match='def1'>
def1
주의 : search 메서드는 일치하는 패턴 1개만 찾아주기 때문에 일치하는 여러 값을 찾고 싶을 경우에는 findall 메서드를 사용해야 한다.
3. findall
search는 맨 처음에 찾은 패턴만 출력하지만, findall은 모든 패턴을 찾아서 리스트 내의 원소로 넣는다.
# search
import re
s = 'hello-world-1234-안녕하세요'
m = re.search('[a-zA-Z]+', s)
print(m)
print(m.group())
# 출력
<re.Match object; span=(0, 5), match='hello'>
hello
# findall
import re
s = 'hello-world-1234-안녕하세요'
m = re.findall('[a-zA-Z]+', s)
print(m)
# 출력
['hello', 'world']
# 활용
import re
string = "나의 핸드폰 번호는 010-2244-9402 이거나 02-555-1023 입니다."
phone_number = re.findall('\d{2,3}-\d{3,4}-\d{3,4}', string)
print(phone_number)
# 출력
['010-2244-9402', '02-555-1023']
메타 문자 활용하기
^
⇒ ^ 는 시작 문자가 일치하는 경우 찾는 메타 문자이다.
예를 들어, 맨 앞에 H로 시작하는 패턴을 찾고 싶을 경우 ^H라고 지정해주면 된다.
import re
string = "Hello world"
m = re.search('^H[a-z]{3,4}', string)
print(m.group())
# 출력
Hello
$, +
$ : 마지막 문자가 일치하는 경우
- : 1개 이상 같은 문자열이 반복될 경우 ( *는 같은 문자열이 반복 되지만 0개여도 매치 된다. )
예를 들어, [a-z]+로 소문자인 문자가 1개 이상이며, d$로 맨 마지막에 문자 d가 포함될 경우 매치되도록 하였다.
import re
string = "Hello woorld"
m = re.search('[a-z]+d$', string)
print(m)
print(m.group())
# 출력
<re.Match object; span=(6, 12), match='woorld'>
woorld
|
: 여러 조건을 만족하는 패턴 찾기
import re
s = 'There is a crow and bird'
# | 앞뒤로 정규식이 2개 있다
m = re.findall('cro*w|bir+d', s)
print(m)
# 출력
['crow', 'bird']
( )
: 그룹으로 묶어주기
import re
s = '2000-10-20 년에 태너았어요'
# | 앞뒤로 정규식이 2개 있다
m = re.search('([0-9]{4})-([0-9]{2})-([0-9]{2})', s)
print(m.group(0))
print(m.group(1))
print(m.group(2))
# 결과
2000-10-20
2000
10
자주 쓰는 정규 표현식
1. 이메일 찾기
: 이메일은 @ 기호가 꼭 들어가고 대부분 영어 알파벳으로 되어 있지만 . - 가 들어간 경우도 있다.
[\w\.-]+@[\w\.-]+ 와 같은 정규 표현식을 사용하면 이메일을 찾을 수 있을 것이다. 또한, 이메일이 여러개 있을 경우를 대비하여 findall 메서드를 사용할 수 있다.
import re
s = 'Ryan has sent an invoice email to john.d@yahoo.com by using his email id ryan.arjun@gmail.com and he also shared a copy to his boss rosy.gray@amazon.co.uk on the cc part.'
m = re.findall(r'[\w\.-]+@[\w\.-]+', s)
print(m)
# 출력
['john.d@yahoo.com', 'ryan.arjun@gmail.com', 'rosy.gray@amazon.co.uk']
2. 이메일 중 올바른 이메일인지 확인하기
import re
def valid_email(email):
regex = r'^[a-z0-9]+[\._]?[a-z0-9]+[@]\w+[.]?\w{2,3}$'
valid = re.search(regex, email)
if valid:
print("Valid email")
else:
print("Invalid email")
email = "mysite.com"
valid_email(email) # 제대로 된 이메일이 아님
email = "mike@korea.co.kr"
valid_email(email) # 제대로 된 이메일
email = "mike@daum.net"
valid_email(email) # 제대로 된 이메일
email = "mike@good"
valid_email(email) # 제대로 된 이메일이 아님
# 출력
Invalid email
Invalid email
Valid email
Valid email
3. 한글 찾기
알파벳을 찾을 때는 [a-z]를 쓰면 되지만 한글을 찾을 때는 [ㄱ-힣]을 쓰면 된다.
import re
s = '한글이에요. good morning. 안녕하세요'
m = re.findall('[ㄱ-힣]+', s)
print(m)
# 출력
['한글이에요', '안녕하세요']
Ref
https://software-creator.tistory.com/32
https://greeksharifa.github.io/정규표현식(re)/2018/08/04/regex-usage-05-intermediate/
'Programming > Python' 카테고리의 다른 글
[Boto3] RDS의 Parameter Group 값을 CSV 추출 스크립트 (0) | 2021.08.23 |
---|---|
[Python] Boto3로 Security Group rule 추가 (csv 파일 이용) (3) | 2021.08.14 |
[Python] 객체지향에서 필수 개념인 Property, Getter, Setter 간단히 알아보기 (0) | 2021.07.10 |
[Python] Decorator 개념 간단히 알아보기 (0) | 2021.07.10 |
[Python] 이터레이터, 제너레이터 개념 (0) | 2021.07.08 |