์ ๊ทํํ์
En Python, ์ ๊ทํํ์(Regular Expression)์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ, aprendamos. ์ ๊ทํํ์์ ๋ฌธ์์ด ํจํด์ ์ฐพ๊ณ ์กฐ์ํ๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ ๋๋ค.
์ ๊ทํํ์์ด๋? ๐โ
์ ๊ทํํ์(regex)์ ํน์ ํจํด์ ๋ฌธ์์ด์ ๊ฒ์ํ๊ณ ์กฐ์ํ๊ธฐ ์ํ ํ์ ์ธ์ด์ ๋๋ค.
import re
# ๊ฐ๋จํ ์์
text = '๋ด ์ ํ๋ฒํธ๋ 010-1234-5678์
๋๋ค.'
pattern = r'\d{3}-\d{4}-\d{4}'
match = re.search(pattern, text)
if match:
print(match.group()) # 010-1234-5678
re ๋ชจ๋ ๊ธฐ๋ณธ ํจ์โ
match(): ๋ฌธ์์ด ์์ ๋ถ๋ถ ๋งค์นญโ
import re
text = 'Python is great'
# ์์ ๋ถ๋ถ์ด ๋งค์นญ๋๋ฉด Match ๊ฐ์ฒด ๋ฐํ
match = re.match(r'Python', text)
if match:
print('๋งค์นญ๋จ:', match.group()) # Python
# ์์ ๋ถ๋ถ์ด ๋งค์นญ๋์ง ์์ผ๋ฉด None
match = re.match(r'Java', text)
if match:
print('๋งค์นญ๋จ')
else:
print('๋งค์นญ ์๋จ')
search(): ๋ฌธ์์ด ์ ์ฒด์์ ์ฒซ ๋ฒ์งธ ๋งค์นญโ
import re
text = 'I love Python programming'
# ๋ฌธ์์ด ์ด๋๋ ๋งค์นญ๋๋ฉด Match ๊ฐ์ฒด ๋ฐํ
match = re.search(r'Python', text)
if match:
print('์ฐพ์:', match.group()) # Python
print('์์น:', match.start(), '-', match.end()) # 7 - 13
findall(): ๋ชจ๋ ๋งค์นญ ์ฐพ๊ธฐโ
import re
text = '์ ํ๋ฒํธ: 010-1234-5678, 010-9876-5432'
pattern = r'\d{3}-\d{4}-\d{4}'
# ๋ชจ๋ ๋งค์นญ์ ๋ฆฌ์คํธ๋ก ๋ฐํ
matches = re.findall(pattern, text)
print(matches) # ['010-1234-5678', '010-9876-5432']
finditer(): ๋ชจ๋ ๋งค์นญ์ iterator๋กโ
import re
text = '๊ฐ๊ฒฉ: 1000์, 2000์, 3000์'
pattern = r'\d+'
# Match ๊ฐ์ฒด๋ฅผ iterator ๋ก ๋ฐํ
for match in re.finditer(pattern, text):
print(f'{match.group()} (์์น: {match.start()}-{match.end()})')
# 1000 (์์น: 4-8)
# 2000 (์์น: 11-15)
# 3000 (์ ์น: 17-21)
sub(): ํจํด ์นํโ
import re
text = '๋ด ์ ํ๋ฒํธ๋ 010-1234-5678์
๋๋ค.'
pattern = r'\d{3}-\d{4}-\d{4}'
# ํจํด์ ๋ค๋ฅธ ๋ฌธ์์ด๋ก ์นํ
result = re.sub(pattern, '***-****-****', text)
print(result) # ๋ด ์ ํ๋ฒํธ๋ ***-****-****์
๋๋ค.
# ํจ์๋ก ์นํ
def mask_phone(match):
phone = match.group()
return phone[:3] + '-****-' + phone[-4:]
result = re.sub(pattern, mask_phone, text)
print(result) # ๋ด ์ ํ๋ฒํธ๋ 010-****-5678์
๋๋ค.
split(): ํจํด์ผ๋ก ๋ถ๋ฆฌโ
import re
text = 'apple,banana;orange:grape'
# ์ฌ๋ฌ ๊ตฌ๋ถ์๋ก ๋ถ๋ฆฌ
parts = re.split(r'[,;:]', text)
print(parts) # ['apple', 'banana', 'orange', 'grape']
# ๊ณต๋ฐฑ์ผ๋ก ๋ถ๋ฆฌ (์ฌ๋ฌ ๊ฐ์ ๊ณต๋ฐฑ ํ์ฉ)
text2 = 'hello world python'
words = re.split(r'\s+', text2)
print(words) # ['hello', 'world', 'python']
๊ธฐ๋ณธ ํจํด ๐โ
๋ฆฌํฐ๋ด ๋ฌธ์โ
import re
# ์ ํํ ๋ฌธ์์ด ๋งค์นญ
print(re.search(r'hello', 'hello world')) # ๋งค์นญ
print(re.search(r'hello', 'Hello world')) # None (๋์๋ฌธ์ ๊ตฌ๋ถ)
# ๋์๋ฌธ์ ๋ฌด์
print(re.search(r'hello', 'Hello world', re.IGNORECASE)) # ๋งค์นญ
๋ฉํ ๋ฌธ์โ
| ๋ฌธ์ | ์๋ฏธ | ์์ |
|---|---|---|
. | ์์์ ๋ฌธ์ 1๊ฐ | a.c โ abc, a1c, a c |
^ | ๋ฌธ์์ด ์์ | ^hello โ hello๋ก ์์ |
$ | ๋ฌธ์์ด ๋ | world$ โ world๋ก ๋๋จ |
* | 0๋ฒ ์ด์ ๋ฐ๋ณต | ab*c โ ac, abc, abbc |
+ | 1๋ฒ ์ด์ ๋ฐ๋ณต | ab+c โ abc, abbc |
? | 0๋ฒ ๋๋ 1๋ฒ | ab?c โ ac, abc |
| | OR | cat|dog โ cat ๋๋ dog |
() | ๊ทธ๋ฃน | (ab)+ โ ab, abab |
[] | ๋ฌธ์ ํด๋์ค | [abc] โ a, b, c ์ค ํ๋ |
{} | ๋ฐ๋ณต ํ์ | a{3} โ aaa |
import re
# ์ (.)์ ์ค๋ฐ๊ฟ ์ ์ธํ ๋ชจ๋ ๋ฌธ์
print(re.search(r'a.c', 'abc').group()) # abc
print(re.search(r'a.c', 'a1c').group()) # a1c
# ๋ณํ(*): 0๋ฒ ์ด์
print(re.search(r'ab*c', 'ac').group()) # ac
print(re.search(r'ab*c', 'abc').group()) # abc
print(re.search(r'ab*c', 'abbc').group()) # abbc
# ํ๋ฌ์ค(+): 1๋ฒ ์ด์
print(re.search(r'ab+c', 'abc').group()) # abc
print(re.search(r'ab+c', 'ac')) # None
# ๋ฌผ์ํ(?): 0๋ฒ ๋๋ 1๋ฒ
print(re.search(r'colou?r', 'color').group()) # color
print(re.search(r'colou?r', 'colour').group()) # colour
๋ฌธ์ ํด๋์คโ
import re
# ๋ฌธ์ ์งํฉ
print(re.findall(r'[aeiou]', 'hello')) # ['e', 'o']
# ๋ฒ์
print(re.findall(r'[a-z]', 'Hello123')) # ['e', 'l', 'l', 'o']
print(re.findall(r'[A-Z]', 'Hello123')) # ['H']
print(re.findall(r'[0-9]', 'Hello123')) # ['1', '2', '3']
# ๋ถ์ (^)
print(re.findall(r'[^0-9]', 'Hello123')) # ['H', 'e', 'l', 'l', 'o']
# ํน์ ๋ฌธ์ ํด๋์ค
print(re.findall(r'\d', 'abc123')) # ['1', '2', '3'] (์ซ์)
print(re.findall(r'\D', 'abc123')) # ['a', 'b', 'c'] (๋น์ซ์)
print(re.findall(r'\w', 'a_1 !')) # ['a', '_', '1'] (๋จ์ด ๋ฌธ์)
print(re.findall(r'\W', 'a_1 !')) # [' ', '!'] (๋น๋จ์ด ๋ฌธ์)
print(re.findall(r'\s', 'a b\tc')) # [' ', '\t'] (๊ณต๋ฐฑ)
print(re.findall(r'\S', 'a b')) # ['a', 'b'] (๋น๊ณต๋ฐฑ)
๋ฐ๋ณต ์ง์ โ
import re
# {n}: ์ ํํ n๋ฒ
print(re.search(r'a{3}', 'aaa').group()) # aaa
print(re.search(r'a{3}', 'aa')) # None
# {n,}: n๋ฒ ์ด์
print(re.search(r'a{2,}', 'aaa').group()) # aaa
# {n,m}: n๋ฒ ์ด์ m๋ฒ ์ดํ
print(re.search(r'a{2,4}', 'aaaaa').group()) # aaaa
# ์ ํ๋ฒํธ ํจํด
phone = re.search(r'\d{3}-\d{4}-\d{4}', '010-1234-5678')
print(phone.group()) # 010-1234-5678
๊ทธ๋ฃน๊ณผ ์บก์ฒ ๐ฏโ
๊ธฐ๋ณธ ๊ทธ๋ฃนโ
import re
text = '์ด๋ฆ: ํ๊ธธ๋, ๋์ด: 30์ธ'
# ๊ทธ๋ฃน์ผ๋ก ์บก์ฒ
pattern = r'์ด๋ฆ: (\w+), ๋์ด: (\d+)์ธ'
match = re.search(pattern, text)
if match:
print('์ ์ฒด:', match.group(0)) # ์ด๋ฆ: ํ๊ธธ๋, ๋์ด: 30์ธ
print('์ด๋ฆ:', match.group(1)) # ํ๊ธธ๋
print('๋์ด:', match.group(2)) # 30
print('๋ชจ๋ ๊ทธ๋ฃน:', match.groups()) # ('