정규 표현식 - 2

LONGNEW·2021년 1월 15일
0

여러가지

목록 보기
13/18

re 모듈.

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

compile 메소드를 사용해서 'ab*' 찾으려는 패턴을 저장.

문자열 검색하는 메소드.


4 개의 메소드 존재.

match, search :

  • 정규식과 매치될 때는 match 객체를 돌려주고,
  • 매치되지 않을 때는 None을 돌려준다.

match

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

p에 소문자가 하나이상 나오는지 확인하는 패턴 저장.

>>> m = p.match("python")
>>> print(m)
<_sre.SRE_Match object at 0x01F3F9F8>

위에서 설명한 것과 같이 "python"내부에 소문자가 존재하기 때문에 match 객체를 리턴함.

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

정규식과 맞지 않으므로. None을 리턴.

아래와 같이 자주 작성한다.

p = re.compile(정규표현식)
m = p.match( 'string goes here' )
if m:
    print('Match found: ', m.group())
else:
    print('No match')
>>> import re
>>> p = re.compile('[a-z]+')

p에 소문자가 하나이상 나오는지 확인하는 패턴 저장.

>>> m = p.search("python")
>>> print(m)
<_sre.SRE_Match object at 0x01F3FA68>

위에서 설명한 것과 같이 "python"내부에 소문자가 존재하기 때문에 search 객체를 리턴함.

>>> m = p.search("3 python")
>>> print(m)
<_sre.SRE_Match object at 0x01F3FA30>

search메소드는 문자열 전체를 검색하기 때문에 처음 나오는 뒤에 나오든 상관이 없다.

findall

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

단어들을 정규식과 매치해서 리스트로 돌려준다.

finditer

>>> result = p.finditer("life is too short")
>>> print(result)
<callable_iterator object at 0x01F5E390>
>>> for r in result: print(r)
...
<_sre.SRE_Match object at 0x01F3F9F8>
<_sre.SRE_Match object at 0x01F3FAD8>
<_sre.SRE_Match object at 0x01F3FAA0>
<_sre.SRE_Match object at 0x01F3F9F8>

반복이 가능한 객체(iterable)을 돌려준다.
위의 객체가 포함하는 요소는 match객체이다


match 객체의 메소드.

>>> m = p.match("python")
>>> m.group()
'python'
>>> m.start()
0
>>> m.end()
6
>>> m.span()
(0, 6)

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

아래의 코드는 search를 이용했을 때이다.

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

백슬래시.

예를 들어 어떤 파일 안에 있는 "\section" 문자열을 찾기 위한 정규식을 만든다고 가정해 보자.

\section

이 정규식은 \s 문자가 whitespace로 해석되어 의도한 대로 매치가 이루어지지 않는다.

위 정규식은 다음과 동일하다.

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

의도한 대로 매치하고 싶다면 다음과 같이 변경해야 한다.

\\section

즉 위 정규식에서 사용한 \ 문자가 문자열 자체임을 알려 주기 위해 백슬래시 2개를 사용하여 이스케이프 처리를 해야 한다.

따라서 위 정규식을 컴파일하려면 다음과 같이 작성해야 한다.

>>> p = re.compile('\\section')

그런데 여기에서 또 하나의 문제가 발견된다. 위처럼 정규식을 만들어서 컴파일하면 실제 파이썬 정규식 엔진에는 파이썬 문자열 리터럴 규칙에 따라 \\로 변경되어 \section이 전달된다.

결국 정규식 엔진에 \ 문자를 전달하려면 파이썬은 \\처럼 백슬래시를 4개나 사용해야 한다.

>>> p = re.compile('\\\\section')

근데 위와 같이 4개를 쓰거나 하면 너무 복잡하니까 또 새로운 규칙을 만들었다.
Raw String.

>>> p = re.compile(r'\\section')

출처 : https://wikidocs.net/430

0개의 댓글