re.sub(r’[^0-9a-z-_.]’, ‘’, new_id)
re.sub(‘[.]+’, ‘.’, new_id)
new_id = re.sub(r'[^0-9a-z-_.]', '', new_id)
특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하며 주로 복잡한 문자열을 처리할 때 사용한다.
정규표현식의 각 문자는 메타문자, 정규문자로 이해됨
a. 은 'a', 'ax', 'a0'과 일치할 수 있다.
.은 포괄적, [a-z]는 덜 포괄적, a는 정확한 패턴(a만 일치)
seriali[sz]e == ["serialise", "serialize"]
와일드카드? : 파일 목록에서 비슷한 이름을 글로브 처리
r의 역할은? : raw string으로 변환해준다.(\을 정규문자화)
print("\가4개인데? \\\\ ") # \가4개인데? \\
print(r"\가4개인데? \\\\ ") # \가4개인데? \\\\
print("\'는? \'\'\'\' ") # '는? ''''
print(r"\'는? \'\'\'\' ") # \'는? \'\'\'\'
matchObj = re.match('a', 'a')
print(matchObj) # <_sre.SRE_Match object; span=(0, 1), match='a'>
m = re.match("a", "aba") # <... span=(0, 1), match='a'>
m = re.match("a", "bba") # None
m = re.fullmatch("a", "aba") # None
m = re.fullmatch("a", "aaa") # None
m = re.fullmatch("a", "a") # <... span=(0, 1), match='a'>
searchObj = re.search('a', 'a')
print(searchObj) # <... span=(0, 1), match='a'>
m = re.search("a", "aba") # <... span=(0, 1), match='a'>
m = re.search("a", "bba") # <... span=(2, 3), match='a'>
m = re.findall("a", "aba") # ['a', 'a']
m = re.findall("a", "bbaaa") # ['a', 'a', 'a']
m = re.findall("aa", "bbaaa") # ['aa'] NO OVERLAPPING
for matchObj in re.finditer('a', 'baa'):
print(matchObj)
# <_sre.SRE_Match object; span=(1, 2), match='a'>
# <_sre.SRE_Match object; span=(2, 3), match='a'>
# compile을 통해 모듈 생성 ( 다음에 해당하는 부분 찾기 )
# 여러번 사용할 때 편하다.
phone = re.compile(r"""
010- # 핸드폰 앞자리
\d{4}- # 중간자리
\d{4} # 뒷자리
""", re.VERBOSE)
phone = re.compile(r"010-\d{4}-\d{4}") # 위와 같은 결과가 나온다.
m = re.match(r"010-\d{4}-\d{4}", "0000")
info = ['홍길동 : 010-1234-1234', '고길동 010-5678-5679']
for text in info:
match_object = phone.search(text) # string 중 phone 정규식에 해당하는 부분 찾아서 저장
print(match_object.span()) # (8, 21) , (4, 17) : 주어진 string 중 해당 부분 (start_idx, fin_idx-1)
print(match_object.group()) # 저장된 부분의 string 출력
# 010-1234-1234 , 010-5678-5679
syntax | long syntax | inline flag | meaning |
---|---|---|---|
re.I | re.IGNORECASE | (?i) | 대소문자 구분 없이 일치 |
re.M | re.MULTILINE | (?m) | ^와 $는 개행문자 위치에서 일치 |
re.S | re.DOTALL | (?s) | 마침표는 개행문자와 일치 |
re.A | re.ASCII | (?a) | {\w, \W, \b, \B}는 ascii에만 일치 |
re.U | re.UNICODE | (?u) | {\w, \W, \b, \B}는 Unicode에 일치 |
re.L | re.LOCALE | (?L) | {\w, \W, \b, \B}는 locale dependent |
re.X | re.VERBOSE | (?x) | 정규표현식에 주석을 달 수 있음 |
DOTALL(re.DOTALL ?s or re.S) : .이 개행(줄바꿈, \n) 문자에 상관없이 모든 문자와 match하는 option (\n을 문자로 보지 않는다.)
p = re.compile('a.b')
m = p.match('a\nb') # m : None
p = re.compile('a.b', re.DOTALL)
m = p.match('a\nb') # <... span=(0, 3), match='a\nb'>
re.findall('(?s)a..', 'abc a a\na') # ['abc', 'a ', 'a\na']
re.findall('(?is)a..', 'Abc') # ['Abc']
IGNORECASE(re.IGNORECASE or re.I) - 대소문자에 관계없이 매치하는 option
p = re.compile('[a-z]+', re.I) # [a-z]+ 정규식은 소문자만 의미함
p.match('Python') # <...span=(0, 6), match='Python'>
MULTILINE(re.MULTILINE, re.M)
import re
p = re.compile("^python\s\w+") # 해석 : python으로 시작하고 그 뒤에 공백문자, 그 뒤에 단어가 와야한다.
m = re.compile("^python\s\w+", re.MULTILINE) # 각 줄마다 정규식 적용
data = """python one
life is too short
python two
you need python
python three"""
print(p.findall(data)) # ['python one']
print(m.findall(data)) # ['python one', 'python two', 'python three']
VERBOSE(re.VERBOSE, re.X)
charref = re.compile(r'&[#](0[0-7]+|[0-9]+|x[0-9a-fA-F]+);')
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)
p = re.compile('\section') # => ' ection'
p = re.compile('\\section') # => '\section'
p = re.compile('\\\\section') # => '\\section'
p = re.compile(r'\\section') # => '\\section'
matchObj = re.findall('\t ', 'a\tb\tc\t \t d') # ['\t ', '\t ']
# 주어진 문자열에서 '가로탭 + 공백' 찾기
matchObj = re.fullmatch("You[;']re studying re module[.,]", 'You;re studying re module,') # <... (0, 26), match='You;re studying re module,'>
re.findall(r'\w\b\W\B', 'ab c d == = e= =f') # ['b ', 'd ', 'e=']
# "단어문자 + 비단어 문자 + 비단어 문자"인 것을 찾기!
예시 1. \bline\b : line과만 일치 ( line : 단어 문자, 비단어 문자 + line + 비단어문자 )
예시 2. \Bcat\B : stacatto와 일치, cat, catch, copycat과 불일치 ( cat : 단어 문자, "단어 문자 + line + 단어문자"이여야 한다.)
예시 3. re.findall(r'\b', 'a') # ['', ''], 단어 문자 + 비단어 문자(\n?)
예시 4. re.findall(r'\B', 'a') # [], 단어 문자 + 단어 문자 혹은 그 반대가 없음.
예시 5. re.findall(r'\b', 'a aa') # ['', '', '', ''], 'a', 'a ', ' a', 'a'사이의 경계
예시 6. re.findall(r'\B', 'a aa') # [''], 'aa'사이의 경계
a.b # a0b, aab, abb, a-b -> 모두 True
# ab, a ->False
a[.]b # a.b -> True 문자 . 그대로를 의미 (모든문자 x)
# a0b -> False
import re
li = ["color", "colour", "coooolor", "excolor", "colr", "xcoloor", "colr", "cor", "colllllr", "colsr"]
for word in li :
if re.search('col.r', word) :
print(word) # color, excolor, colsr
matchObj = re.findall('r..n[.]', 'ryan. ruin rain round. reign')
# ['ryan.']
re.findall('\Aryan\d\Z', 'ryan1') # ['ryan1']
re.findall('^ryan\d$', 'ryan1') # ['ryan1']
re.findall('\A ryan\d\s\Z', ' ryan1 \n ryan2 \n rain1 \n ryan3 ') # []
re.findall('^ ryan\d\s$', ' ryan1 \n ryan2 \n rain1 \n ryan3 ') # []
re.findall('^ ryan\d\s$', ' ryan1 \n ryan2 \n rain1 \n ryan3 ', re.M) # [' ryan1 ', ' ryan2 ', ' ryan3 ']
re.findall('^ ryan\d\s$', ' ryan1 \n ryan2 \n rain1 \n ryan3 ', re.MULTILINE) # [' ryan1 ', ' ryan2 ', ' ryan3 ']
re.findall('one|two|three', 'one four two three zero') # ['one', 'two', 'three']
a*c # aac, aaaac, aaaaaaaaaaaaaaac -> True
# acc, abc, asc -> False
(ab)*c # c, abc, ababc, abababababc -> True
# abbc, ac, abcc, c
for word in li :
if re.search('col*r', word) : # co(l*)r
print(word) # colr, cor, colllr
# .*은 0이상 글자
for word in li :
if re.search('col.*r', word) : # co(l.*)r
print(word) # color, colour, excolor, xcoloor, colr, colllr, colsr
regular_expressions = '<html><head><title>Title</title>'
print(len(regular_expressions)) # 32
print(re.match('<.*>', regular_expressions).span()) # (0, 32) : 맨 처음 위치와 맨 마지막 위치
print(re.match('<.*>', regular_expressions).group()) # group화한 해당 string ( str[0:32] )
ab+c # abc, abbc, abbbc -> True
# ac, acc, acbb -> False