[python] ๋ฌธ์์ด ์ ๊ทํํ์ ์ ๋ฆฌ
๐ข ๊ฐ์
์ ๊ทํํ์(Regular Expressions) : ๋ณต์กํ ๋ฌธ์์ด์ ์ฒ๋ฆฌํ ๋ ์ฌ์ฉํ๋ ๋๊ตฌ
- ํน์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ์ข ์๋ ๋ฌธ๋ฒ์ ๊ฐ์ง ๊ฒ์ด ์๋๋ผ, ๋ฌธ์์ด์ ์ฒ๋ฆฌํ๋ ๊ณณ์ด๋ผ๋ฉด ํญ๋๊ฒ ์ฌ์ฉ ๊ฐ๋ฅ
- ํ์ด์ฌ์ ๊ธฐ๋ณธ ๋ชจ๋ ์ค re ๋ชจ๋์ด ์ ๊ทํํ์์ ์ง์
๐ ์ ๋ฐฐ์์ผ ํ ๊น ?
๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๊ฐ ์ฃผ์ด์ก๋ค๊ณ ์๊ฐํด๋ณด์.
[ ๋ณด์์ ์ํด ๊ณ ๊ฐ ์ ๋ณด ์ค ์ ํ๋ฒํธ ๊ฐ์ด๋ฐ ์๋ฆฌ์ ์ซ์๋ * ๋ฌธ์๋ก ๋ณ๊ฒฝํ์ธ์. ]
๊ณ ๊ฐ ์ ๋ณด๋ ์ด๋ฆ, ์ฃผ๋ฏผ๋ฒํธ, ์ ํ๋ฒํธ๊ฐ ๋ฌธ์์ด ๋ฐ์ดํฐ๋ก ์ฃผ์ด์ง๋ค๊ณ ๊ฐ์ ํด๋ด ์๋ค.
text = '''
Elice 123456-1234567 010-1234-5678
Cheshire 345678-678901 01098765432
'''
์ด ๋ฌธ์ ๋ฅผ ์ ๊ท์์ ์ฌ์ฉํ์ง ์๊ณ ํ๋ ค๋ฉด ๋งค์ฐ ๋ณต์กํ๊ฒ ํ์ด์ผ ํฉ๋๋ค.
- ์ ์ฒด ํ ์คํธ๋ฅผ ๊ณต๋ฐฑ ๋ฌธ์๋ฅผ ๊ธฐ์ค์ผ๋ก ๋๋๋ค.
- ๋๋์ด์ง ๋ฌธ์์ด์ด ์ ํ๋ฒํธ ํ์์ธ์ง ์ ๊ฒํ๋ค.
- ์ ํ๋ฒํธ๋ฅผ ๋ค์ ๋๋์ด ๊ฐ์ด๋ฐ ์๋ฆฌ์ ์ซ์๋ฅผ *๋ก ๋ณํํ๋ค.
- ๋๋ ๋ฌธ์์ด์ ๋ค์ ํฉ์ณ ์ ํ๋ฒํธ๋ฅผ ์์ฑํ๋ค.
๊ทธ๋ฐ๋ฐ ๋๋์ด์ง ๋ฌธ์์ด์ ์ ํ๋ฒํธ ํ์์ธ์ง ์ด๋ป๊ฒ ์ ๊ฒํ ๊น์? ๊ทธ๋ฆฌ๊ณ ๊ฐ์ด๋ฐ ์๋ฆฌ์ ์ซ์๋ ์ด๋ป๊ฒ ๋๋์ด *๋ก ๋ณํํ๊ณ ๋ค์ ํฉ์น ๊น์?
์ค์๊ฐ์์ผ๋ก ์ ํ๋ฒํธ์ ๊ตฌ๋ถ๋ฌธ์์ธ -๋ ์๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ํด๊ฒฐ์ ๋์ฑ ์ฝ์ง ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ ๊ทํํ์์ ์ด์ฉํ๋ฉด ๋งค์ฐ ๊ฐํธํ๊ฒ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
์์ ์๋ก ๋ ์ ํ๋ฒํธ๊ฐ์ด, ์ํ๋ ํ์์ ๋ฌธ์์ด์ ๊ฒ์ํ ๋ ๋ฉํ๋ฌธ์์ ์๋์ ๋ฑ ๋ค์ํ ํจํด์ ์ฌ์ฉํ์ฌ ๋งค์นํ๊ณ , ๊ทธ๋ฃนํ์ ์ด์ฉํ์ฌ ์ํ๋ ๋ถ๋ถ๋ง ๊ณจ๋ผ๋ด๊ณ re๋ชจ๋์ ๋ฉ์๋๋ก ๋ฌธ์์ด์ ์์ ํ ์๋ ์์ต๋๋ค.
๐ข re ๋ชจ๋
import re
๐ข ์ ๊ท์ ๊ฒ์ฌ ํจ์
๋ฌธ์์ด์ ๋ํด ์ ๊ท์์ผ๋ก ๊ฒ์ฌํ๋ ํจ์๋ ๋ํ์ ์ผ๋ก 4๊ฐ์ง๊ฐ ์๋ค.
ํจ์ ์ด๋ฆ | ๊ธฐ๋ฅ |
re.match(pattern, string) | string ์์ ๋ถ๋ถ๋ถํฐ ํจํด์ด ์กด์ฌํ๋์ง ๊ฒ์ฌํ์ฌ MatchObject๋ฅผ ๋ฐํํจ. |
re.search(pattern, string) | string ์ ์ฒด์์ pattern์ด ์กด์ฌํ๋์ง ๊ฒ์ฌํ์ฌ MatchObject๋ฅผ ๋ฐํํจ. |
re.findall(pattern, string) | string ์ ์ฒด์์ ํจํด๊ณผ ๋งค์น๋๋ ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ์ฐพ์ list๋ก ๋ฐํํจ. |
re.finditer(pattern, string) | string ์ ์ฒด์์ ํจํด๊ณผ ์ผ์นํ๋ ๊ฒฐ๊ณผ์ ๋ํ iterater ๊ฐ์ฒด๋ฅผ ๋ฐํํจ. |
๐ข ๋ฌธ์์ด ์์ ํจ์
re ๋ชจ๋์๋ ํจํด๊ณผ ๋งค์น๋ ๋ฌด์์ด์ ์ฐพ์์ค ๋ฟ๋ง ์๋๋ผ, ํธ์งํ ์ ์๋ ํจ์๋ค๋ ์กด์ฌํ๋ค.
ํจ์ ์ด๋ฆ | ๊ธฐ๋ฅ |
re.sub(pattern, repl, string) | string ์์ pattern๊ณผ ๋งค์นญ๋๋ ๋ถ๋ถ์ repl๋ก ์์ ํ ๋ฌธ์์ด์ ๋ฐํํจ. |
re.subn(pattern, repl, string) | re.sub()๊ณผ ๋์ผํ์ง๋ง, ํจ์์ ๊ฒฐ๊ณผ๋ฅผ (๊ฒฐ๊ณผ ๋ฌธ์์ด, ๊ต์ฒด ํ์)๊ผด์ ํํ๋ก ๋ฐํํจ. |
๐ข ๋ฉํ ๋ฌธ์
๋ฉํ ๋ฌธ์๋ ํน์ ํ ๋ฌธ์ ํน์ ๊ณ์ด์ ํํํ๋ ์ฝ์๋ "๊ธฐํธ" ์ด๋ค.
๋ฉํ ๋ฌธ์๋ฅผ ์ด์ฉํ๋ฉด ํน์ ํ ๊ท์น์ ๊ฐ์ง ์ฌ๋ฌ ๋จ์ด๋ฅผ ์งง๊ฒ ์์ถํ ์ ์์ด ํธ๋ฆฌํ๋ค.
- [^ ] ์ ๊ฐ์ด ๋ฌธ์ํด๋์ค [ ] ์์ ^์ด ์ฐ์ด๋ฉด, ๋ฌธ์์ด์ ์์์ด ์๋, not ์ ์๋ฏธ๋ก ์ฌ์ฉ
- [ - ]๋ฌธ์ํด๋์ค [ ] ์์ - ๋ฅผ ๊ธฐ์ค์ผ๋ก, ์ผ์ชฝ ์ค๋ฅธ์ชฝ์ ๋ฒ์๋ก ์ธ ๋ฌธ์๋ฅผ ์ฐ๋ฉด, ๊ทธ ์ฌ์ด์ ๋ฒ์์ ํด๋นํ๋ ๋ฌธ์ ์ ๋ถ๋ฅผ ์๋ฏธํ๋ค. ๋ฐ๋์ ์ผ์ชฝ์ ์ ๋์ฝ๋(๋๋ ์์คํค์ฝ๋)๊ฐ์ด ์ค๋ฅธ์ชฝ๋ณด๋ค ์์์ผํ๋ค.
- โ "(?i)" = "(?i) ํ๋๊ทธ" ๋ผ๊ณ ๋ถ๋ฅธ๋ค. ํน์ ํจํด ์์น์ ์๊ด์์ด, ์ด ํ๋๊ทธ๋ฅผ ๋ฃ์ด์ฃผ๋ฉด, ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์๊ฒ ๋ค๋ ์๋ฏธ
๐ข ์๋์(Quantifier)
๋์ผํ ๊ธ์๋ ํจํด์ด ๋ฐ๋ณต๋ ๋, ๊ทธ๋๋ก ์ ๊ทํํ์์ ๋ง๋ค๊ณ ์ ํ๋ฉด ์๋นํ ๋ถํธํ๋ค.
\d ์ \w๋ฅผ ์ด์ฉํ๋ฉด ๊ฐ๊ฐ ์ซ์์ ๋ฌธ์๋ฅผ "ํ ๊ธ์"์ฉ ๋งค์นญํด์ค๋ค.
์ด๋, ์ด์ด์ง๋ ๋ฌธ์๋ฅผ ํจํด์ผ๋ก ๋ง๋ค์ด, "๋จ์ด ๋จ์"๋ก ๋งค์นญํด์ผ ํ ๋ ๋งค์ฐ ๋ถํธํ๋ค.
์ด๋ฐ ์ํฉ์์ ์ ์ฉํ๊ฒ ์๋์(Quantifier) ์ด๋ค.
- โ
? = "์๋์ ํ์์ฑ ์ต์ " ์ฐ์ฐ์
ํ์, "0๊ฐ ๋๋ 1๊ฐ"๋ฅผ ์๋ฏธํ๋ ์๋์ฐ์ฐ์ ? ์๋ ๋ค๋ฅธ ํํ์ด๋ค !! (์ฃผ์) - ์๋์์ ์๋ ํน์ฑ์ "ํ์์ "์ด๋ผ์, ๋งค์นญ๋๋ "์ต๋ํ ๊ธด ๋ฌธ์์ด์ ๋ฐํ"ํ๋๋ฐ, ๊ทธ๊ฒ ์๋๋ผ ๊ฐ๋ฅํ "์ต์ํ"์ ์๋๊ณผ ๋งค์นญํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ค.
ex) text = "<html><head><title>์ ๋ชฉ</head></html>" ์ผ ๋
1. pattern = "<.*>" ์ผ ๋
๐ ["<html><head><title>์ ๋ชฉ</head></html>"] ์ ์ฒด ํ๋๊ฐ ๋ฐํ ๋ ๊ฒ์ด๋ค. <์ ์์๊ณผ >์ ๋งจ๋์ ๊ธฐ์ค
2. pattern = <.*?>" ์ผ ๋ ( ์๋์ ํ์ ์ต์ ์ฌ์ฉ )
๐ [ "<html>" , "<head>" , "<title>" , "</head>", "</html>" ] ๋ฐํ. < >์ ์ต์ํ์ ๊ธฐ์ค์ผ๋ก ๋๋๋ค.
๐ข ๊ทธ๋ฃน
( ) ๋ ๊ทธ๋ฃน์ ๋ํ๋ธ๋ค. ๊ทธ๋ฃน์ ์ ์ฒด ํจํด ๋ด์์ "ํ๋๋ก ๋ฌถ์ฌ์ง๋ ํจํด"์ ๋งํ๋ค.
๊ทธ๋ฃน๊ณผ | ๋ฅผ ๊ฒฐํฉํ ํํ, ๋๋ ๊ทธ๋ฃน ๋ค์ ์๋์๋ฅผ ๋ถ์ด๋ ํจํด์ผ๋ก ์์ฃผ ์ฌ์ฉ๋๋ค.
์์
- (e|a)lice ๋ elice, alice์ ๋งค์นญ๋ฉ๋๋ค.
- (tom|pot)ato๋ tomato, potato์ ๋งค์นญ๋ฉ๋๋ค.
- (base|kick){2} ์ basebase, basekick, kickkick, kickbase ์ ๋งค์นญ๋ฉ๋๋ค.
๊ทธ๋ฃน ์ฐธ์กฐ ์์
- ํน์ ๋ฌธ์์ด = "(๊ทธ๋ฃน1)์ผ๋ผ์ผ๋ผ~(๊ทธ๋ฃน2)" << ์์๊ฐ ์๋ค์น์.
- โ ์ด ๊ทธ๋ฃน์ "์ฐธ์กฐ"ํ ๋, "\g<๊ทธ๋ฃน๋ฒํธ>" ๋ฅผ ์ฌ์ฉํ์ฌ, ๋ด๊ฐ ์ ์ํ๋, ์ ๊ท์์ ๊ทธ๋ฃน์ ์ฐธ์กฐํ ์ ์๋ค.
๊ทธ๋ฃน์ ์ฌ์ฌ์ฉ
ํ ๋ฒ ๋ง๋ ๊ทธ๋ฃน์ ์ฌ์ฌ์ฉํ ์๋ ์์ต๋๋ค. ๋ง๋ค์ด์ง ์์๋ถํฐ 1๋ฒ๋ถํฐ ์์ํ๋ ๊ทธ๋ฃน์ผ๋ก ์ฐธ์กฐํ ์ ์๋๋ฐ, ๋งค์นํ ๊ทธ๋ฃน์ ํจํด ๋ด์์ ์ฌ์ฌ์ฉํ๋ ค๋ฉด \\1๊ณผ ๊ฐ์ด ๊ทธ๋ฃน ๋ฒํธ๋ฅผ ์ด์ค์ผ์ดํํ์ฌ ๋ํ๋ด์ผ ํฉ๋๋ค.
์์
- (to)ma\\1์ tomato์ ๋งค์นญ๋ฉ๋๋ค. ๊ดํธ๋ฅผ ์ฌ์ฉํ์ฌ ์์์ ๋ง๋ ๊ทธ๋ฃน (to)๋ฅผ ๋ค์์ ์ฌ์ฌ์ฉํ๋ ๋ชจ์ต์ ๋๋ค.
๊ทธ ์ธ ( group( ) ๋ฉ์๋ )
์ด์ธ์๋ ๊ทธ๋ฃน์๋ re ๋ชจ๋์ match ๊ฐ์ฒด์ ์ํด์๋ group ๋ฉ์๋๋ฅผ ์ด์ฉํ์ฌ ๋งค์นญ๋ ๊ฒฐ๊ณผ ์ค ์ผ๋ถ ๋ด์ฉ๋ง์ ์ถ์ถํ ์ ์๋ ๋ฑ ๋ค์ํ ์ฌ์ฉ๋ฒ์ด ์์ต๋๋ค.
text = "๋ชฉํํ
์คํธ"
pattern = "์ ๊ทํํ์"
match_object = re.search(pattern, text) # ๋งค์นญ๋ "๊ฐ์ฒด"๋ฅผ ๋ฐํ
match_object.group() # ๋งค์นญ๋ ๊ฐ์ฒด ๊ธฐ๋ฐ์ผ๋ก, ๊ทธ๋ฃจํ
๐ข ๋น์บก์ณ๋ง๊ทธ๋ฃน
์๋ฅผ๋ค์ด, "tomato potato" ๋ผ๋ ๋ฌธ์์ด์ด ์๋ค. ์ฌ๊ธฐ์, tomato ์ potato๋ฅผ ๋ฝ์๋ด๊ธฐ์ํด ์์ , "๊ทธ๋ฃน"์ผ๋ก๋"(tom|pot)ato"๋ฅผ ํจํด์ผ๋ก ๋ฃ์ ๊ฒ์ด๋ค.
๐ ๊ทธ๋ฌ๋, ๊ฒฐ๊ณผ๋ ["tom", "pot"] ์ผ๋ก ๋์ฌ ๊ฒ์ด๋ค.
โ
์ด์ ๋, ํ์ด์ฌ ์ ๊ทํํ์์์ ๊ทธ๋ฃน์ผ๋ก "์บก์ณ" ํ ๋ถ๋ถ์ด ์๋ค๋ฉด, "์ด์ธ์ ๋ถ๋ถ๋ค์ ์ถ๋ ฅํ์ง ์๊ธฐ ๋๋ฌธ"์ด๋ค.
์ ํจํด์์๋, "ato"๋ ๊ทธ๋ฃน์ ์ํด์์ง ์๊ธฐ ๋๋ฌธ์, findall ํจ์์์ ๋๋ฝ(ํด๋น๋์ง X)๋ ๊ฒ์ด๋ค.
ํด๊ฒฐ๋ฒ
๐ ๊ทธ๋ฃน ( ) ์์ ?: ์ ๋ถ์ธ๋ค. ( ex. "(?:tom|pot)ato)" )
๋จ, ๋น์บก์ณ๋ง ๊ทธ๋ฃน์ ์บก์ณ๊ฐ ๋์ง ์๋ ๊ทธ๋ฃน์ด๊ธฐ ๋๋ฌธ์, "์ฐธ์กฐํ์ฌ ์ฌ์ฉํ ์ ์๋ค."
๋น์บก์ณ๋ง๊ทธ๋ฃน์ ํจํด ๋ฌธ์๋ค์ ๋ฌถ๋, ๊ทธ๋ฃน ๋จ์๋ก ๋งค์นญ๋์ง๋ ์๊ฒ๋ ํ๋ค.
๊ทธ๋ฃน์ผ๋ก ๋ฌถ์ ๊ฒ๋ค์ "์ต์ข
๊ฒฐ๊ณผ"์์ ๋ฐ๋ก ๊ตฌ๋ถํ์ฌ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ์ ์ ์ฉํ๋ค.
๐ Reference : Elice Academy