728x90

여러분은 정규표현식이 무엇인지 아시나요 ?
정규표현식이란 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식언어입니다. 현재 정규 표현식은 많은 텍스트 편집기 프로그래밍 언어에서 문자열의 검색과 치환을 위해 많이 사용되고 있습니다.
python 도 예외는 아닙니다.
쉘 프로그래밍을 해보신 분이라면 sed 등의 유틸리티도 친숙하실텐데 이러한 유틸리티에서 문자열 치환 등을 할 때 무지하게 많이 사용하는 것도 정규식입니다.

정규표현식이 왜 사용되는지, 왜 필요한지 한번 다음 예를 하나만 볼까요 ?

    "xxxxxxxxxxxx@xxxxxxxxxxxxx"  
-> 이걸 정규표현식으로 바꾸면
x+@x+

원래의 string 이 얼마나 길던지 간에 반복되는 문자를 '+' 기호를 사용하여 하나의 표현으로 압축하였습니다. 위의 x+ 정규식은 x 가 몇개이건 반복되는 것을 한방에 표현한 것입니다. 즉, @ 를 사이에 두고 양쪽에 x 문자 모두까지 포함해서 일컫는 것입니다. 훨씬 간단해지죠 ?
이렇게 어떤 문자열의 패턴을 파악하여 간단히 약속된 형식으로 표현해내는 것이 정규식의 핵심내용이라고 보시면 됩니다.
'+' 기호를 패턴을 표현하는데 사용하듯이 이러한 정규식을 이해하려면 특수한 의미를 가지고 있는 대표적인 정규식 표현들은 기억하고 있는 것이 좋습니다. 그래야만 일정한 패턴의 문자열을 검색하고 치환하기 위해 정규식으로 먼저 표현해낼 수 있지 않겠어요 ? ^^

일단 아주 간단히 몇 가지만 알아 보시다.

  • .(점)은 어떤 문자이건 하나의 문자를 가리킨다. (new line 제외)
  • \w 는 대소문자와 밑줄을 포함하는 모든 영숫자 [a-zA-Z0-9_]를 가리킨다.
  • \s 는 space, tab 등 white space 를 가리킨다. (\S 는 non-whitespace)
  • + 는 1개 또는 그 이상을 가리킨다.
  • * 는 0 개 또는 그 이상을 가리킨다.
  • ? 는 0 개 또는 1 개를 가리킨다.
  • \ 는 특수문자를 표현하는 용도로 사용되지만, 특수문자앞에서는 특수문자의 사용을 제외하고 문자자체를 나타내도록 한다.
이외에 많은 정규식 표현법들이 있는데요.
이에 대한 리스트는 이곳 [ 
http://kio.zc.bz/Lecture/regexp.html ] 에서 필요할 때 찾아보시기 바랍니다.

python 에서 정규식을 사용하여 문자열 검색, 치환 등을 수행하려re 모듈을 import 해야 합니다.

 

>>> import re

>>> dir(re)

['DEBUG', 'DOTALL', 'I', 'IGNORECASE', 'L', 'LOCALE', 'M', 'MULTILINE', 'S', 'Scanner', 'T', 'TEMPLATE', 'U', 'UNICODE', 'VERBOSE', 'X', '_MAXCACHE', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__version__', '_alphanum', '_cache', '_cache_repl', '_compile', '_compile_repl', '_expand', '_pattern_type', '_pickle', '_subx', 'compile', 'copy_reg', 'error', 'escape', 'findall', 'finditer', 'match', 'purge', 'search', 'split', 'sre_compile', 'sre_parse', 'sub', 'subn', 'sys', 'template']

>>> 

re 모듈을 import 한 후 dir 을 통해 symbol 들을 확인해보니, 함수 list 중에서 우리가 앞으로 제일 많이 사용하게 될 findall, match, search 함수 등이 보이는군요.
어떤 모듈이나 객체에서 제공하는 함수들을 사용할 때는 인자와 리턴형이 매우 중요합니다.
특히, 리턴형을 정확히 알고 있어야 해당 리턴되는 값을 이용하여 무엇인가 작업을 할 수 있습니다.

만약, 어떤 함수의 리턴형이 string 인데 이를 int 형 처럼 사용하려고 하면 에러가 발생하겠죠. string 객체에서 지원하는 함수들을 이용하여 해당 리턴값을 구워삶아야할 것입니다.

 

여러분은 help(re.findall), help(re.match), help(re.search) 명령어를 이용하여 이 3 개의 함수의 인자가 무엇이고 리턴형이 무엇인지를 먼저 확인해 보시기 바랍니다.
제가 확인해본 결과 함수들의 리턴형은 다음과 같습니다.

 

  • findall : 리턴형은 list
  • match, search : 리턴형은 match object

"match object" 라는 것이 새로이 등장했네요.
정규식에서는 이 match object 라는 것이 많이 사용됩니다. 객체(object)라는 것을 유념해야 합니다.
즉, 리턴된 match object 는 그 자체로 또 리턴데이터를 다루는 함수들을 제공한다는 것입니다.

이게 무슨말인고 하니...

re 의 match 나 search 함수의 인자로 원래의 문자열과 정규식 문자열(Pattern String)을 주면, 해당 함수는 해당 정규식을 해석하여 원래 문자열에서 이를 검색한 후 이 결과를 object 형태로 돌려줍니다.
'찾은 문자열을 객체의 데이터멤버에 저장해 두었으니, 당신은 이 객체에서 제공하는 함수들을 이용하여 당신이 원하는 형태로 결과로 저장된 데이터멤버들을 구워삶아도 좋소'...라는 의미인 것입니다.

 

출처 : http://cloudrain21.tistory.com/entry/파이썬python-정규식-정규표현식Regular-Expression-첫번째

728x90

'Python' 카테고리의 다른 글

python module  (0) 2014.05.02
python regular expressions2  (0) 2014.05.02
python file  (0) 2014.05.02
python dictionary  (0) 2014.05.02
python tuple  (0) 2014.05.02

+ Recent posts