정규식을 컴파일할 때, 다음 옵션을 사용할 수 있다.
DOTALL(S)
'.'이 줄바꿈 문자를 포함하여 모든 문자와 매치할 수 있도록 한다
IGNORECASE(I)
대소문자와 관계없이 매치할 수 있도록 한다
MULTILINE(M)
여러줄과 매치할 수 있도록 한다('^','$' 메타문자의 사용과 관계있는 옵션)
VERBOSE(X)
verbose 모드를 사용할 수 있도록 한다
(정규식을 보기 편하게 만들 수 있고 주석등을 사용할 수 있게 된다.)
옵션을 사용할 때, re.DOTALLL을 사용해도 되고, re.S로 사용해도 됨
'.'는 '\n'을 제외한 모든 문자와 매치되는 규칙이 있다.
'\n'을 포함하고 싶다면 re.DOTALL or re.S 옵션을 사용하면 된다.
import re
p = re.compile('a.b', re.DOTALL)
m = p.match('a\nb')
print(m)
<re.Match object; span=(0, 3), match='a\nb'>
그리고 DOTALL 자리에 소문자 s를 넣어봤더니, re는 s라는 특성을 갖고 있지 않다는 에러가 뜬다.
아! 대소문자 구분 잘 해야하는구나
import re
p = re.compile('[a-z]', re.I)
p.match('python')
print(p)
p.match('Python')
print(p)
p.match('PYTHON')
print(p)
모든 문자에 대한 정규식이고, 대소문자 구분없이 매치된다.
multilinne은 '^', '$'와 연관된 옵션이다.
'^' : 문자열 처음을 의미
'$' : 문자열 마지막을 의미
예를 들어, 정규식이 '^python' 이라면 문자열의 처음은 항상 'python'이 되어야 하고,
'python$'이라면 문자열의 마지막이 항상 'python'으로 끝나야 한다.
import re
p = re.compile('^python\s\w+')
data = """python one
life is
pythone two
too short
"""
print(p.findall(data))
['python one']
이라는 결과가 출력된다.
re.compile안의 뜻은 python으로 시작하고, 뒤에 whitespace, 그 뒤에 단어
이렇게 되어야 한다는 뜻이다
화이트스페이스가 뭔지 몰라서 찾아보니 아래와 같은 뜻이 있었다.
나는 화스트페이스 이런거나 알았는데.. 하..ㅋㅋ
화이트스페이스란?
화이트스페이스(Whitespace)는 에드윈 브래디(Edwin Brady)와 크리스 모리스(Chris Morris, cim)가 2003년 4월 1일(만우절)에 발표한 난해한 프로그래밍 언어이다. 문법에는 오로지 공백과 탭, 그리고 개행 문자만이 의미가 있으며, 인터프리터는 이 3종류의 공백 문자를 뺀 모든 문자를 무시한다. 2004년 현재 이 언어의 최신 버전은 0.3이다.
출처 : https://ko.wikipedia.org/wiki/%ED%99%94%EC%9D%B4%ED%8A%B8%EC%8A%A4%ED%8E%98%EC%9D%B4%EC%8A%A4_(%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D_%EC%96%B8%EC%96%B4)
'^' 메타문자에 의해 첫 번째 줄만 매치되는데, 각 라인의 첫 줄만 인식시키고싶다면?
이 때 MULTILINE을 사용한다.
import re
p = re.compile('^python\s\w+', re.MULTILINE)
data = """
python one
life is
python two
too short
python three
hello
"""
print(p.findall(data))
['python one', 'python two', 'python three']
기존에 멀티라인 없이 data = """
python one
...
"""
이렇게 하면 첫 줄이 엔터여서 아무것도 안 나왔는데, 멀티라인 사용하니 원하는대로 가져올 수 있다.
정규식을 보면 이상한 암호같은 게 많은데, 이 어려운 걸 주석 or 줄단위로 구분할 수 있다면?
그 때 사용하는 게 re.VERBOSE / re.X 이다.
아래와 같은 예시를 보자
import re
charref = re.compile(r"""
&[#] # Start of a numeric entity reference
(
0[0-7]+ # Octal form
| [0-9]+ # Decimal form
| x[0-9a-fA-F]+ # Hexadecimal form
)
; # Trailing semicolon
""", re.VERBOSE)
...?
이게 무슨소린가 싶다
re.VERBOSE()를 사용하면, 문자열에 사용된 whitespace는 컴파일할 때 제거된다
(단, []안에 사용한 whitespace는 제외)