>>> import re
>>> p = re.compile('ab*')
compile 메소드를 사용해서 'ab*'
찾으려는 패턴을 저장.
4 개의 메소드 존재.
match, search :
>>> 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
메소드는 문자열 전체를 검색하기 때문에 처음 나오는 뒤에 나오든 상관이 없다.
>>> result = p.findall("life is too short")
>>> print(result)
['life', 'is', 'too', 'short']
단어들을 정규식과 매치해서 리스트로 돌려준다.
>>> 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
객체이다
>>> 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')