본문 바로가기
Python

정규식

by GGoris 2015. 2. 3.
반응형

core Python Applications Programming 3rd를 참고하여 작성하였습니다.


Windows Python 3.4.2를 사용하였습니다.




정규식


일정한 규약이나 규칙의 모양이나 상태 라는 의미로

다양한 문자열들의 패턴을 표현하는 문자열을 말합니다.

리눅스에서의 와일드카드와 비슷한 느낌을 받을 수 있습니다.




1. 문자열 자체(literal)


일반적으로 사용하는 문자열또한 정규식이라 할 수 있습니다.


'string'이라는 정규식은 'string'이라는 문자열 패턴을 표현하는 것이죠.



2. |(pipe)


정규식

python|java

python, java


파이프 문자는 서로 다른 정규식을 분리(구분)할때 사용합니다.

'python 혹은 java'를 의미를 갖습니다.




3. .(dot)


정규식

a.c

abc, acc, agc, a c

asd,ert,cvn

.end

send,tend,4end


점 문자는 모든 문자(.와 \n을 제외한) 1개와 매칭됩니다.




4. ^, $, \b, \B


정규식

^From

From Korea

py$

module.py

^asdf$

asdf

\bFrom

i'm From Korea.

\Bore

I'm From Korea.

\bFrom\b

From 단어 자체


^는 한 정규식 앞에 붙으며, 해당 정규식으로 시작하는 문자열을 의미합니다.

$는 한 정규식 뒤에 붙으며, 해당 정규식으로 끝나는 문자열을 의미합니다.

위 2가지를 함깨쓴다면, 해당 정규식 자체를 의미합니다.

^ 대신 \A를, $ 대신 \Z를 사용할 수도 있습니다.

\b는 해당 정규식앞 혹은 뒤에 띄어쓰기나 탭등 단어의 경계가 있음 의미합니다.

\b뒤의 정규식으로 시작하는 단어의 substring을 의미합니다.

\B는 \b의 반대의미(정규식 형태의 문자열 앞 혹은 뒤에 경계문자가 없는)이며,

쉽게 말하자면 한 단어의 중간 substring을 의미합니다.




5. [ - ^ ]


정규식

c[aeiou]p

cap, cep, cip, cop, cup

[0-9]

0, 1, 2, 3, 4, 5, 6, 7, 8, 9

[^aeiou]

모음을 제외한 문자

[u-v][a-j]

ud, va, ..


[] 대괄호는 자신 안에 있는 문자들중 하나의 문자를 의미합니다.

단어의 시작을 의미하는 ^가 대괄호 안에서는 부정의 의미를 나타 냅니다.

^는 대괄호안의 맨 처음에 쓰이며, 그이후의 문자들을 제외한 나머지 문자들 중 하나를 나타냅니다.

-하이픈은 범위를 나타냅니다. A-Z, a-z, 0-9등 영문자, 숫자의 범위내 한 문자를 나타내며,

["-a]처럼 아스키값을 기준으로한 범위도 가능합니다.




6. * + ? {}


정규식

asdf*

asd, asdf, asdfffffff

asdf?

asd, asdf

[0-9]{2,3}

02,332 (2개 혹은 3개의 숫자)

</?[^>]+>

HTML의 태그


*는 왼쪽의 정규식이 0번 이상의 수(0 포함)가 나타남을 의미합니다.

?는 왼쪽의 정규식이 0번 혹은 1번 나타남을 의미합니다.

+는 왼쪽의 정규식이 1번 이상의 수(0 제외)가 나타남을 의미합니다.

{}는 {N,M} 으로 사용되며, N횟수이상, M횟수이하의 반복을 의미합니다.

f{2,10}이라고한다면, ff 부터 ffffffffff까지의 패턴을 나타내는것이죠.




7. ()


정규식

\d+(\.\d*)?

0.004, 2, 5., 688.01

(Mr?s?\. )

Mr. , Ms. , Mrs. , M. 


()소괄호는 '(정규식)'과 같은 형태로 사용되며 해당 정규식을

하나의 정규식 그룹을 만들거나, 서브그룹으로 매치시킬 수 있습니다.

여러 정규식이 섞인 복잡한 정규식을 하나의 정규식 처럼 사용할 수있고,

8에 나올 \N을 이용해 서브정규식을 불러다 사용할 수 있습니다.




8. 특수문자


정규식

\d

[0-9]

\w

[A-Za-z0-9]

\s

[ \n\t\r\v\f]

\b

단어의 경계

\N

서브그룹의 정규식과 매치

\c

이스케이프, 특수 문자를 보통의 문자처럼

\A(\Z)

^, $과 매치


\d는 십진숫자

\w는 하나의 영문자혹은십진숫자

\s는 공백문자

\b는 단어의 경계

\N는 7의 ()소괄호에 등록된 서브그룹의 정규식과 매칭 (\2, \13)

\c는 @,# 등과같은 특수문자들을 일반 문자처럼 취급하도록함 (\#, \^ 등)







파이썬에서의 정규식 사용



파이썬은 re 라는 모듈을 통해 정규식을 지원합니다.

이 모듈에는 compile, match, search와 같은 함수들이 있습니다.

re모듈의 match와 search등의 기능을 사용할 수도 있고,

compile함수를 통해 정규식 객체를 만들어 해당 객체의 메서드를 사용할 수도 있습니다.


다음은 간단한 이메일 패턴을 검사합니다.

>>> Aaddress="asdf@google.com"
>>> Baddress="asdf@google.com."
>>> Caddress="@google.com"
>>> re.match("\w+@\w+\.(com|net|org)$",Aaddress,flags=0)
<_sre.SRE_Match object; span=(0, 15), match='asdf@google.com'>
>>> re.match("\w+@\w+\.(com|net|org)$",Baddress,flags=0)
>>> re.match("\w+@\w+\.(com|net|org)$",Caddress,flags=0)

match()결과는 문장 앞부분이 pattern과 일치해야 합니다.




다음은 위와 같지만 compile 함수를 통해 정규식 객체를 만들어 사용합니다.


>>> reg_email = re.compile("\w+@\w+\.(com|net|org)$",flags=0)
>>> reg_email.match(Aaddress)
<_sre.SRE_Match object; span=(0, 15), match='asdf@google.com'>
>>> reg_email.match(Baddress)
>>> reg_email.match(Caddress)


reg_email 이라는 정규식 객체를 만들고,

해당 정규식 객체의 메서드로  match를 사용한 결과입니다.


match메서드의 결과는 match 객체를 반환합니다.

match객체는 group()와 groups() 메서드를 가지고있습니다.


group는 매칭된 결과를 보여주며,

groups는 매칭된 서브그룹으로 이루어진 튜플을 반환 합니다.


위 코드를 조금 변경해보겠습니다.

>>> reg_email2=re.compile("(\w+)@(\w+\.com|net|org)$",flags=0)
>>> A2match=reg_email2.match(Aaddress)
>>> A2match.group()
'asdf@google.com'
>>> A2match.groups()
('asdf', 'google.com')

위와같이 서브그룹을 지어주고 groups()메서드를 통해

메일의 아이디부분과 주소부분으로 나눌수도 있습니다



search()와 match()의 패턴검사는 같습니다.

다만 match()는 문장 앞부분이 pattern과 일치해야하지만,

search()는 pattern과 일치하는 부분 문자열을 찾아줍니다.


>>> m=re.match('foo','seafood')
>>> m.group()
Traceback (most recent call last):
  File "<pyshell#36>", line 1, in <module>
    m.group()
AttributeError: 'NoneType' object has no attribute 'group'
>>> m=re.search('foo','seafood')
>>> m.group()
'foo'

match를 이용한 match 객체는 'NoneType에러'가발생

search를 이용한 match객체는 검색된 foo를 반환합니다.










반응형

'Python' 카테고리의 다른 글

python singleton instance with qwindow  (0) 2018.06.06
파이썬 한글 유니코드 변환 에러  (0) 2014.12.30
파이썬 연산자  (0) 2014.12.29
파이썬 수치자료형  (0) 2014.12.25
파이썬 제어문  (0) 2014.12.23

댓글