본문 바로가기

Programming/Python

[Python] 정규 표현식 정리 #1 - 기초

반응형

정규 표현식은 파이썬 뿐만 아니라 모든 언어에서 사용하며, 문자열 내에서 원하는 문자만 추출하고 싶을 때 사용한다. 처음 배우기에는 러닝 커브가 있지만 한 번 배워두면 활용성이 너무 높기 때문에 꼭 배우는 것을 추천한다.

정규 표현식을 하기 위해서는 다음의 메타 문자들과 익숙해 질 필요가 있다. 각각 어떤 의미를 지니고 있는지 파악해보자.

. ^ $ * + ? \ | ( ) { } [ ]

정규 표현식의 기초

.

⇒ 일치하는 모든 문자열 (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/

 

반응형