Regular Expression

문자 클래스로 만들어진 정규식은 “[와 ] 사이의 문자들과의 매치”라는 의미를 갖는다.

하이픈(-)을 사용하게 되면 두 문자 사이의 범위(From - To)를 의미한다.

문자 클래스 내에 ^ 메타 문자가 사용될 경우에는 반대(not)라는 의미를 갖는다

대문자로 사용된 것은 소문자의 반대

\d 숫자와 매치. [0-9]와 동일한 표현식이다.
\D 숫자가 아닌 것과 매치. [^0-9]와 동일한 표현식이다.
\s whitespace 문자와 매치. [\t\n\r\f\v]와 동일한 표현식. 맨 앞의 빈 칸은 공백문자를 의미한다.
\S whitespace 문자가 아닌 것과 매치. [^\t\n\r\f\v]와 동일한 표현식이다.
\w 문자+숫자와 매치. [a-zA-Z0-9]와 동일한 표현식이다.
\W 문자+숫자가 아닌 문자와 매치. [^a-zA-Z0-9]와 동일한 표현식이다.
# 정규표현식    Regular Expression
import re
p = re.compile( "[a-z]+" )
print( p.match( "" ) )
print( p.match( " " ) )
print( p.match( "a " ) )
print( p.match( "python!!" ) )
print( p.match( "Python!!" ) )
print( p.match( "pyThon!!" ) )
print( p.match( " python!!" ) )

print( p.search( "" ) )
print( p.search( " " ) )
print( p.search( "a " ) )
print( p.search( "python!!" ) )
print( p.search( "Python!!" ) )
print( p.search( "pyThon!!" ) )
print( p.search( " python!!" ) )
word = p.search( " python!!" )
print( word.start() )
print( word.end() )
print( word.span() )
print( word.group() )

s = "Life is too Short"
print( p.match( s ) )     
print( p.search( s ) )
print( p.findall( s ) )   
print( p.finditer( s ) )
for word in p.finditer( s ) :
    print( word.group() )

p = re.compile( "a.b" )
print( p.search( "ab" ) )
print( p.search( "ac" ) )
print( p.search( "acb" ) )
print( p.search( "a0b" ) )
print( p.search( "a&b" ) )
print( p.search( "a\\tb" ) )
print( p.search( "a\\nb" ) )
print( p.search( "accb" ) )

s = """
    abc acb accb a
    cb a\\nb a0b a\\tb
"""
print( p.findall( s ) )
p = re.compile( "a.b", re.DOTALL )          # re.S    \\n 도 가능
print( p.findall( s ) )

p = re.compile( "[A-Z]+")
print( p.findall( s ) )
p = re.compile( "[A-Z]+", re.IGNORECASE )   # re.I    대소문자 상관없이
print( p.findall( s ) )

s = """python one
pythontwo
python
study python
python 1
life is too short"""
p = re.compile( "^python\\s\\w+" )
print( p.findall( s ) )
p = re.compile( "^python\\s\\w+", re.MULTILINE )  # re.M
print( p.findall( s ) )