
ํน์ ํ ๊ท์น์ ๊ฐ์ง ๋ฌธ์์ด์ ์งํ ์ ํํํ๋๋ฐ ์ฌ์ฉํ๋ ํ์ ์ธ์ด
A built-in package called
re, which can be used to work with Regular Expression
import re
text = "The rain in Spain"
x = re.search("^The.*Spain$, txt)
| Function | Description |
|---|---|
| findall | Returns a list containing all matches |
| search | Returns a Match object if there is a match anywhere in the string |
| split | Returns a list where the string has been split at each match |
| sub | Replaces one or many matches with a string |
๋ฌธ์์ด์ ์ฒ์๋ถํฐ ์์ํด์ ์์ฑํ ํจํด์ด ์ผ์นํ๋์ง ํ์ธ
import re
print(re.match('a','ab'))
print(re.match('a','bba'))
# <re.Match object; span=(0, 1), match='a'>
# None
match์ ์ ์ฌํ์ง๋ง ํจํด์ด ๋ฌธ์์ด์ ์ฒ์๊ณผ ์ผ์นํ์ง ์์๋ ๋จ
import re
print(re.match('a','ab'))
print(re.match('a','abba'))
# <re.Match object; span=(0, 1), match='a'>
# <re.Match object; span=(2, 3), match='a'>
๋ฌธ์์ด ์์ ํจํด์ ๋ง๋ ์ผ์ด์ค๋ฅผ ์ ๋ถ ์ฐพ์์ ๋ฆฌ์คํธ๋ก ๋ฐํ
import re
print(re.findall('a','a'))
print(re.findall('a','aba'))
print(re.findall('\d', '์ซ์123์ด ์ด๋ ๊ฒ56 ์๋ค8'))
print(re.findall('\d+', '์ซ์123์ด ์ด๋ ๊ฒ56 ์๋ค8'))
# ['a']
# ['a', 'a']
# ['1', '2', '3', '5', '6', '8']
# ['123', '56', '8']
findall()๊ณผ ์ ์ฌํ์ง๋ง ํจํด์ ๋ง๋ ๋ฌธ์์ด์ ๋ฆฌ์คํธ๊ฐ ์๋ iterator ํ์์ผ๋ก ๋ฐํ
import re
re_iter = re.finditer('a', 'baa')
for s in re_iter:
print(s)
# <re.Match object; span=(1, 2), match='a'>
# <re.Match object; span=(2, 3), match='a'>
๋ฌธ์์ด์ ์์๊ณผ ๋์ด ์ ํํ๊ฒ ํจํด๊ณผ ์ผ์นํ ๋ ๋ฐํ
match()๋ ์ฒ์๋ถํฐ ํจํด์ ๋ง์ผ๋ฉด ๋ฐํ์ ํ์ง๋ง ํด๋น ํจ์๋ ์์๊ณผ ๋์ด ์ ํํ๊ฒ ์ผ์นํด์ผ ํจ
import re
print(re.fullmatch('a', 'a'))
print(re.fullmatch('a', 'aaa'))
print(re.fullmatch('a', 'ab'))
print(re.fullmatch('a', 'ba'))
print(re.fullmatch('a', 'baa'))
# <re.Match object; span=(0, 1), match='a'>
# None
# None
# None
# None
๋ฌธ์์ด์์ ํจํด์ด ๋ง์ผ๋ฉด ์ด๋ฅผ ๊ธฐ์ ์ผ๋ก ๋ฆฌ์คํธ๋ก ์ชผ๊ฐ๋ ํจ์
๋ง์ฝ 3๋ฒ์งธ ์ธ์(์ต๋ split ์)๋ฅผ ์ง์ ํ๋ฉด ๋ฌธ์์ด์ ์ง์ ํ ์ ๋งํผ ์ชผ๊ฐ๊ณ ๊ทธ ์๊ฐ ๋๋ฌํ๋ฉด ์ชผ๊ฐ์ง ์์
import re
print(re.split('a', 'abaabca'))
print(re.split('a', 'abaabca', 2))
# ['', 'b', '', 'bc', '']
# ['', 'b', 'abca']
๋ฌธ์์ด์ ๋ง๋ ํจํด์ 2๋ฒ์งธ ์ธ์(๊ต์ฒดํ ๋ฌธ์์ด)๋ก ๊ต์ฒด
์ต๋ ๊ต์ฒด ์๋ฅผ ์ง์ ํ๋ฉด ๋ฌธ์์ด์ ๋ง๋ ํจํด์ ๊ต์ฒดํ ๋ฌธ์์ด๋ก ๊ต์ฒดํ๊ณ ๊ทธ ์๊ฐ ๋๋ฌํ๋ฉด ๋์ด์ ๊ต์ฒดํ์ง ์์
import re
print(re.sub('a', 'z', 'ab'))
print(re.sub('a', 'zxc', 'ab'))
print(re.sub('a', 'z', 'aaaab'))
print(re.sub('a', 'z', 'aaaab', 1))
# zb
# zxcb
# zzzzb
# zaaab
sub()์ ๋์์ ๋์ผํ์ง๋ง ๋ฐํ ๊ฒฐ๊ณผ๊ฐ ๊ฒฐ๊ณผ(๋ฌธ์์ด, ๋งค์นญํ์) ํํ๋ก ๋ฐํ๋จ
import re
print(re.subn('a', 'z', 'ab'))
print(re.subn('a', 'zxc', 'ab'))
print(re.subn('a', 'z', 'aaaab'))
print(re.subn('a', 'z', 'aaaab', 1))
# ('zb', 1)
# ('zxcb', 1)
# ('zzzzb', 4)
# ('zaaab', 1)
๋ง์ฝ ํจํด๊ณผ ํ๋๊ทธ๊ฐ ๋์ผํ ์ ๊ท์์ ์ฌ๋ฌ๋ฒ ์ฌ์ฉํ๋ ค๋ฉด compile()๋ฅผ ์ฌ์ฉํ๋ฉฐ ์ง์ ํ ๋ค์, ์์ ํจ์๋ค์ ์ฌ์ฉ ๊ฐ๋ฅ
import re
c = re.compile('a')
print(c.sub('zxc', 'abcdefg'))
print(c.search('vcxdfsa'))
# zxcbcdefg
# <re.Match object; span=(6, 7), match='a'>
์ complie()๋ก ๋ง๋ค์ด ๋์ ๊ฐ์ฒด๋ ์บ์์ ๋ณดํต 100๊ฐ๊น์ง ์ ์ฅ๋๊ณ ๊ทธ ์๋ฅผ ๋์ด๊ฐ๋ฉด ์ด๊ธฐํ ๋จ
purge()๋ฅผ ํธ์ถํ๋ฉด 100๊ฐ๊ฐ ๋์ด๊ฐ์ง ์์๋ ์บ์๋ฅผ ์ด๊ธฐํ ํ๋ ํจ์์
๋๋ค.
import re
re.purge()
ํจํด์ ์ ๋ ฅ ๋ฐ์ผ๋ฉด ํน์๋ฌธ์๋ค์ ์ต์ค์ผ์ดํ(๋ฐฑ์ฌ๋์ฌ)์ฒ๋ฆฌ๋ฅผ ํ ๋ค์ ๋ฐํ
import re
print(re.escape('(\d)'))
# \(\\d\)
findall()๋ฅผ ์ ์ธํ๊ณ ๋ชจ๋ ํจ์๋ค์ ๋ฐํ์ match object๋ก ๋ฐํ๋จ
mathch object์์๋ group(),start(), end(),span()๊ณผ ๊ฐ์ด ์ฐพ์ ํจํด์ด ๋ฌธ์์ด์ ์์น๋ ๋งค์นญ ๋ฌธ์์ด์ ๋ฐํํ๋ ํจ์ ์ ๊ณต
์๋ฅผ ๋ค์ด search()๋ก ํจํด์ ๋ง๋ ๋ฌธ์์ด์ ์ฐพ์๋ค ํ๋ฉด
group() ๋ฉ์๋๋ฅผ ํตํด ํจํด์ ๋ง๋ ๋ฌธ์์ด์ ์ถ์ถ
start()๋ฅผ ์ฌ์ฉํด ๋ฌธ์์ด์์ ์ด๋๋ถํฐ ํจํด์ ๋ง๋ ๋ฌธ์๊ฐ ์์ํ๋์ง
end()๋ฅผ ํตํด ์ด๋๊น์ง์ธ์ง
span()์ผ๋ก ์ด๋๋ถํฐ ์ด๋๊น์ง์ธ์ง
ํ์ธํ ์ ์์
import re
result = re.search('aa', 'baab')
print(result.group())
print(result.start())
print(result.end())
print(result.span())
# aa
# 1
# 3
# (1, 3)
groupdict()๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ํจํด์ ๋ง๋ ๊ฒฐ๊ณผ์ ์ด๋ฆ์ ์ฃผ์ด์ผํจ
ํจํด์ ์ด๋ฆ์ ์ฃผ๋ ค๋ฉด (?P<์ด๋ฆ>) ํ์์ด ๋์ด์ผ๋ง ํฉ๋๋ค. ์ฌ๊ธฐ์๋ ์๊ดํธ๊ฐ ์กด์ฌํ์ง ์์ผ๋ฉด ์๋ฌ๊ฐ ๋ฐ์
import re
result = re.match('(?P<front>\d{2})-(?P<middle>\d{3,4})-(?P<rear>\d{4})', '02-123-1234')
print(result.groupdict())
print(result.groups())
print(result.group(1))
print(result.group('front'))
# {'front': '02', 'middle': '123', 'rear': '1234'}
# ('02', '123', '1234')
# 02
# 02
์ ํจ์๋ค์ ๊ฐ์ฅ ๋ง์ง๋ง ์ธ์์๋ ํจํด์ ์ถ๊ฐํ ์ ์์ผ๋ฉฐ re๋ชจ๋์ ์๋์ ๊ฐ์ ํจํด์ ์ง์
| Acronym | Name | Description |
|---|---|---|
| re.I | IGNORECASE | ์ํ๋ฒณ ๋์๋ฌธ์ ๊ตฌ๋ถX |
| re.M | MULTILINE | ์ฌ๋ฌ ์ค์ ๋ฌธ์์ด์ ๋ํด ํจํด ํ์ ๊ฐ๋ฅ |
| re.S | DOTALL | .๋ฉํ ๋ฌธ์๊ฐ ๊ฐํ ๋ฌธ์์ ๋งค์น๋๋๋ก ํจ |
| re.X | VERBOSE | ์ ๊ท์ ์์ ๊ณต๋ฐฑ ๋ฌด์ |
| re.U | UNICODE | ๋ฌธ์ ๋ถ๋ฅ์ Unicode Encoding์ ์ง์ ํจ |
import re
s = """
c
b
A
"""
print(re.search('a', s, re.M|re.I))
# <re.Match object; span=(5, 6), match='A'>
๐ ์ฌ๋ฌ ํจํด(ํ๋๊ทธ)๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด |์ฌ์ฉ