정규표현식

0

Python

목록 보기
4/5
post-thumbnail

정규표현식은 언제 사용되는가?

정규표현식은 전처리 등의 작업을 위해 복잡한 문자열을 처리할 때 자주 사용된다.

1. 컴파일 후 매칭 (re.compile)

원하는 문자열을 re.compile(조건) 형태로 객체화시킨 후,
이를 사용하여 문자열 검색을 수행할 수 있다.

import re
r = re.compile([a-z]) # 패턴(소문자 a-z)를 가지고 있는 r 객체를 리턴한다. 

# match함수는 아래에서 자세히 살펴본다.
m = r.match('aBc3') # 문자열(aBc3)이 소문자로 시작하는 패턴을 갖는가? Y
print(m.group()) # a

2. 축약형

math, search 등의 메소드 안에 패턴과 문자열을 모두 집어넣는 방법

import re
str1 = 'aBc3'
m = re.match('[a-z]', str1)
print(m.group()) # a

메타문자

:원래 그 문자가 가진 뜻이 아닌 특수한 기능을 하는 문자.
compile로 패턴을 만드려면 패턴을 나타내는 메타문자를 알아야 한다.

. * [ ] ^ $ + ? { }  \ | ( )
문자기능예시
.1개의 문자a.b는 a□b 의 형태를 갖는 3자리 단어이다.
*0번 이상 반복a*b는 a가 0번 이상 반복되고 b가 오는 단어
b, ab, kaab등
+1번 이상 반복a+b는 a가 1번 이상 반복되고 b가 오는 단어
ab(0) aab(0) aaaaa(x) akb(x)
{m,n}최소 m번 이상, 최대 n번 이하로 반복a{2}: a가 2번 반복
a{2,}: a가 2번 이상 반복
a{2,5}: a가 최소 2번 이상, 최대 5번 반복
$문자열이나 행의 마지막을 의미한다.
a$: a로 끝나는 문자열
?존재여부a?b는 a가 있을 수도, 없을 수도를 의미.
b, ab
[]포함[ ~ ] 안의 문자 중 하나를 선택한다. [abc]d는 ad, bd, cd를 의미한다.
또한, '-'와 함께 쓰면 범위를 지정해줄 수 있다. [a-z]는 a-z사이의 문자를 의미한다.(a-z, A-Z, 1-9 가능)
[^ ]제외해당 문자들은 제외한다는 의미이다.
[^a-z]: 알파벳 소문자 제외
^처음문자열이나 행의 처음을 의미한다.
^a: a로 시작하는 문자열
$문자열이나 행의 마지막을 의미한다.
a$: a로 끝나는 문자열


정규표현식 메소드

re.match

문자열의 처음부터 정규식(패턴)과 일치되는지 조사.
일치하는게 없을 경우 re.match는 None을 반환한다.
패턴이 발견되면 검색을 멈추고 패턴을 객체로 return 한다.

  1. 컴파일 사용
r = re.compile('[a-z]') # 소문자로 시작하는 패턴
m = r.match( "let's study hard" )
print(m.group()) # 결과: l

#문자열이 소문자로 시작하지 않을 경우
m_none = r.match("Let's study hard") # 소문자로 시작하지 않음= 일치하는게 없음
print(m_none) # 결과: None
print(m_none.group()) # 결과: AttributeError: 'NoneType' object has no attribute 'group'
  1. 축약형
m2 = re.match('[a-z]*', "let's study hard" ) # 소문자가 계속 반복되는 패턴
print(m2.group()) # 결과: let

re.search

match는 문자열의 처음부터 찾는다면, search는 처음부터 끝까지 확인.
일치하는게 없을 경우 re.search는 None을 반환한다.
패턴이 발견되면 검색을 멈추고 패턴을 객체로 return 한다.

  1. 컴파일 사용
r = re.compile('[a-z]') # 소문자로 시작하는 패턴
m = r.search( "Let's study hard" )
print(m)
# 결과: <re.Match object; span=(1, 2), match='e'>
# span(1,2)는 1번째 index인 e부터 시작하여, 2번째 인덱스 전까지를 의미한다.
print(m.group()) # 결과: e
  1. 축약형
m2 = re.search('[a-z]*', "let's study hard" ) # 소문자가 계속 반복되는 패턴
print(m2.group()) # 결과: let

re.finall

문자열 중 패턴과 일치되는 부분을 모두 찾아 리스트 형태로 return 한다.
일치하는게 없을 경우 빈 리스트를 return.

r = re.compile('[a-z]') # 패턴: 소문자
m = r.findall('A Bc deF')
print(m)
# 결과: ['c', 'd', 'e']

m2 = r.findall('MY NAME IS..') # 소문자가 없음
print(m2)
# 결과: []

re.finditer

findall처럼 문자열 중 패턴과 일치되는 부분을 모두 찾는다.
다만, 매치되는 문자열을 iterator 객체로 return한다.
iterator 객체 값을 불러오려면 for문을 사용해야 한다.

r = re.compile('[a-z]') # 패턴: 소문자
m = r.finditer('A Bc deF')
print(m) # 결과: <callable_iterator object at 0x7f70ca5b1690>

# iterator 객체인 m을 불러오려면
for i in m:
  print(i)
  print(i.group())

# 결과
<re.Match object; span=(3, 4), match='c'>
c
<re.Match object; span=(5, 6), match='d'>
d
<re.Match object; span=(6, 7), match='e'>
e
profile
학습의 마무리는 '나의 언어로 설명하기'가 아닐까?

0개의 댓글