ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Chapter 07-2 정규 표현식 시작하기_2
    Do it! 점프 투 파이썬 2022. 6. 9. 18:10

    파이썬에서 정규 표현식을 지원하는 re 모듈

    파이썬은 정규 표현식을 지원하기 위해 re(regular expression의 약어) 모듈을 제공한다. re 모듈은 파이썬을 설치할 때 자동으로 설치되는 기본 라이브러리로 사용 방법은 다음과 같다.

    >>> import re
    >>> p = re.compile('ab*')

     

    re.compile을 사용하여 정규 펴현식(위 예에서는 ab*)을 컴파일한다. re.compile의 결과로 돌려주는 객체 p(컴파일된 패턴 객체)를 사용하여 그 이후의 작업을 수행할 것이다.

     

     

     

     

    정규식을 사용한 문자열 검색

    이제 컴파일된 패턴 객체를 사용하여 문자열 검색을 수행해 보자. 컴파일된 패턴 객체는 다음과 같은 4가지 메서드를 제공한다.

    메서드 목적
    match() 문자열의 처음부터 정규식과 매치되는지 조사한다.
    search() 문자열 전체를 검색하여 정규식과 매치되는지 조사한다.
    findall() 정규식과 매치되는 모든 문자열(substring)을 리스트로 돌려준다.
    finditer() 정규식과 매치되는 모든 문자열(substring)을 반복 가능한 객체로 돌려준다.

    match, search는 정규식과 매치될 때는 match 객체를 돌려주고, 매치되지 않을 때는 None을 돌려준다. 이들 메서드에 대한 간단한 예를 살펴보자.

     

    우선 다음과 같은 패턴을 만들어 보자.

    >>> import re
    >>> p =re.compile('[a-z]+')

     

     

    match

    match 메서드는 문자열의 처음부터 정규식과 매치되는지 조사한다. 위 패턴에 match 메서드를 수행해 보자.

    >>> m = p.match("python")
    >>> print(m)
    <re.Match object; span=(0, 6), match='python'>   <- match 객체를 돌려줌

    "python"문자열은 [a-z]+ 정규식에 부합되므로 match 객체를 돌려준다.

     

    >>> m = p.match("3 python")
    >>> print(m)
    None

    "3 python" 문자열은 처음에 나오는 문자 3이 정규식 [a-z]+에 부합되지 않으므로 None을 돌려준다.

     

    match의 결과로 match 객체 또는 None을 돌려주기 때문에 파이썬 정규식 프로그램은 보통 다음과 같은 흐름으로 작성한다.

    p = re.compile(정규 표현식)
    m = p.match("조사할 문자열")
    if m:
        print('Match found: ', m.group( ))
    esle:
        print('No match')

    즉 match의 결괏값이 있을 때만 그다음 작업을 수행하겠다는 것이다.

     

     

    search

    컴파일된 패턴 객체 p를 가지고 이번에는 search 메서드를 수행해 보자.

    >>> m = p.search("python")
    >>> print(m)
    <re.Match object; span=(0, 6), match='python'>

    "python" 문자열에 search 메서드를 수행하면 match 메서드를 수행했을 때와 동일하게 매치된다.

     

    >>> m = p.search("3 python")
    >>> print(m)
    <re.Match object; span=(2, 8), match='python'>

    "3 python" 문자열의 첫 번째 문자는 "3"이지만 search는 문자열의 처음부터 검색하는 것이 아니라 문자열 전체를 검색하기 때문에 "3" 이후의 "python" 문자열과 매치된다.

     

    이렇듯 match 메서드와 search 메서드는 문자열의 처음부터 검색할지의 여부에 따라 다르게 사용해야 한다.

     

     

    findall

    이번에는 findall 메서드를 수행해 보자.

    >>> result = p.findall("life is too short")
    >>> print(result)
    ['life', 'is', 'too', 'short']

    "life is too short" 문자열의 'life', 'is', 'too', 'short' 단어를 각각 [a-z]+ 정규식과 매치해서 리스트로 돌려준다.

     

     

    finditer

    이번에는 finditer 메서드를 수행해 보자.

    >>> result = p.finditer("life is too short")
    >>> print(result)
    <callable_iterator object at 0x01F5E390>
    >>> for r in result: print(r)
    ...
    <re.Match object; span=(0, 4), match='life'>
    <re.Match object; span=(5, 7), match='is'>
    <re.Match object; span=(8, 11), match='too'>
    <re.Match object; span=(12, 17), match='short'>

    finditer는 findall과 동일하지만 그 결과로 반복 가능한 객체(iterator object)를 돌려준다. 반복 가능한 객체가 포함하는 각각의 요소는 match 객체이다.

     

     

     

     

    match 객체의 메서드

    자, 이제 match 메서드와 search 메서드를 수행한 결과로 돌려준 match 객체에 대해 알아보자. 앞에서 정규식을 사용한 문자열 검색을 수행하면서 아마도 다음과 같은 궁금증이 생겼을 것이다.

    - 어떤 문자열이 매치 되었는가?
    - 매치된 문자열의 인덱스는 어디부터 어디까지인가?

    match 객체의 메서드를 사용하면 이 같은 궁금증을 해결할 수 있다. 다음 표를 보자.

    메서드 목적
    group() 매치된 문자열을 돌려준다.
    start() 매치된 문자열의 시작 위치를 돌려준다.
    end() 매치된 문자열의 끝 위치를 돌려준다.
    span() 매치된 문자열의 (시작, 끝)에 해당하는 튜플을 돌려준다.

     

    다음 예로 확인해 보자.

    >>> import re
    >>> p = re.compile('[a-z]+')
    >>> m = p.match("python")
    >>> m.group( )
    'python'
    >>> m.start( )
    0
    >>> m.end( )
    6
    >>> m.span( )
    (0, 6)

    예상한 대로 결괏값이 출력되는 것을 확인할 수 있다. match 메서드를 수행한 결과로 돌려준 match 객체의 start( ) 값은 항상 0일 수밖에 없다. 왜냐하면 match 메서드는 항상 문자열의 시작부터 조사하기 때문이다.

     

    만약 search 메서드를 사용했다면 start( ) 값은 다음과 같이 다르게 나올 것이다.

    >>> m = p.search("3 python")
    >>> m.group( )
    'python'
    >>> m.start( )
    2
    >>> m.end( )
    8
    >>> m.span( )
    (2, 8)

     

     

    * 모듈 단위로 수행하기

    지금까지 우리는 re.compile을 사용하여 컴파일된 패턴 객체로 그 이후의 작업을 수행했다. re 모듈은 이것을 좀 축약한 형태로 사용할 수 있는 방법을 제공한다. 다음 예를 보자.

    >>> p = re.compile('[a-z]+')
    >>> m = p.match("python")

    위 코드가 축약된 형태는 다음과 같다.

    >>> m = re.match('[a-z]+', "python"

    위 예처럼 사용하면 컴파일과 match 메서드를 한 번에 수행할 수 있다. 보통 한 번 만든 패턴 객체를 여러번 사용해야 할 때는 이 방법보다 re.compile을 사용하는 것이 편하다.

     

     

     

     

     

     

    출처 : "점프 투 파이썬"

Designed by Tistory.