ํ์ด์ฌ์์ ๋ฌธ์์ด์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์์ฃ . ๊ทธ ์ค ์ ๊ทํํ์์ ์ด์ฉํ๋ฉด ์ข ๋ ๋ค์ํ๊ณ ์ฝ๊ฒ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์์ต๋๋ค.
๊ทธ๋์ ์ด๋ฒ ๊ธ์์๋ ํ์ด์ฌ์์ ์ ์ฉํ ๋ชจ๋ ์ค ์ ๊ท์์ ์ฒ๋ฆฌํด์ฃผ๋ re ๋ชจ๋์ ์ด์ฉํด์ ๋ฌธ์์ด์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด๋ ค๊ณ ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ฐ์ฅ ๋ง์ง๋ง์ ๋ฐฐ์ด๊ฑธ ํ ๋๋ก ์นด์นด์ค ๋ฌธ์ ์ธ [3์ฐจ] ํ์ผ๋ช ์ ๋ ฌ์ ์ ์ฉํด๋ณด๋ ค๊ณ ํฉ๋๋ค.
๊ทธ๋ผ ๋ ์ธ ๋๋์ฝ๋!
re ๋ชจ๋์ ํจ์๋ค
re ๋ชจ๋์๋ ๋ค์ํ ํจ์๋ค์ด ์กด์ฌํฉ๋๋ค. ๊ทธ ์ค ์๊ณ ๋ฆฌ์ฆ ํ์ด์ ์ ์ฉํ ๊ฒ ๊ฐ์ ํจ์๋ค์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
- search
- match
- fullmatch
- findall
- finditer
- sub
- subn
- split
search()
๋ฌธ์์ด์์ ํจํด์ด ์ผ์นํ๋ ์ง ํ์ธํฉ๋๋ค.
print(re.search("A", "A-10521 IronMan Mark II").group())
# A
print(re.search("[a-zA-Z]+", "A-10521 IronMan Mark II").group())
# A
match()
๋ฌธ์์ด์ ์ฒ์๋ถํฐ ์์ํด ํจํด๊ณผ ์ผ์นํ๋ ์ง ํ์ธํฉ๋๋ค.
re.match("A", "A-10521 IronMan Mark II").group()
# A
re.match("B", "A-10521 IronMan Mark II").group()
# Error
์ฒซ๋ฒ์งธ ๊ฐ์ ๊ฒฝ์ฐ ์ ๋ ฅ ๋ฐ์ ๋ฌธ์์ด์ด A ๋ก ์์ํ๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก A ๋ฅผ ๋งค์นญํด์ค๋๋ค.
๋๋ฒ์งธ ๊ฐ์ ๊ฒฝ์ฐ ๋ฌธ์์ด์ด A ๋ก ์์ํ๋๋ฐ ํจํด์ B ๋ก ๋งค์นญํ๊ธฐ ๋๋ฌธ์ group() ์ผ๋ก ์ฐพ์ ์ ์์ด ์๋ฌ๋ฅผ ํ ํด๋ ๋๋ค.
์ ๊ท์์๋ ๊ทธ๋ฃน์ด๋ผ๋ ๊ฐ๋ ์ด ์กด์ฌํ๋๋ฐ ๊ทธ ๊ทธ๋ฃน์ ์ถ๋ ฅํ๋ ค๋ฉด group() ํจ์๋ฅผ ์ด์ฉํด์ผํจ
๊ทธ๋ผ ์ด๋ฒ์๋ ์ ๊ท์์ ์ด์ฉํด์ "A-10521 IronMan Mark II" ์์ "A-10521" ๋ง ์ถ์ถํด๋ณด์ฃ .
re.match("\S+", "A-10521 IronMan Mark II").group()
re.match("[0-9a-zA-Z-]+", "A-10521 IronMan Mark II").group()
re.match("[0-9a-zA-Z-]{0,}", "A-10521 IronMan Mark II").group()
re.match("[0-9a-zA-Z-]{0,7}", "A-10521 IronMan Mark II").group()
re.match(".{0,7}", "A-10521 IronMan Mark II").group()
# A-10521
์์ ์๋ ๋ฐฉ์ ๋ชจ๋ ๊ฐ์ "A-10521" ์ ์ถ๋ ฅํฉ๋๋ค.
์ ์ ๋ ๊ฒ ๋๋์ง๋ ํ์ด์ฌ re ๋ชจ๋์ ํด๋นํ๊ธฐ๋ณด๋ค๋ ์ ๊ท์ ํจํด์ ์์์ผ ํ๋ ๋ถ๋ถ์ธ๋ฐ ๊ฐ๋จํ๊ฒ ํ๋ฒ ์ดํด๋ณด์ฃ !
๊ทธ ์ ์ ์ ๊ท์์๋ "[].\*" ์ ๊ฐ์ ๋ฉํ ๋ฌธ์๊ฐ ์กด์ฌํ๋๋ฐ ๊ฐ ๋ฉํ๋ฌธ์๋ฅผ ๋ฌด์์ ์๋ฏธํ๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ "\" ๋ฅผ ํ์ฉํ ํํ๋ฒ๋ ์์ต๋๋ค.
๊ทธ๋ผ ์ด์ ๊ฐ๋จํ๊ฒ ์ดํด๋ณด์ฃ .
re.match("\S+", "A-10521 IronMan Mark II").group()
# ๋์ด์ฐ๊ธฐ๊ฐ ์๋๋๊น์ง(\S) 1๋ฒ๋ถํฐ ๋ฌดํ๋๊น์ง(+) ํํ
re.match("[0-9a-zA-Z-]+", "A-10521 IronMan Mark II").group()
# 0~9, a~z, A~Z, - ์ผ๋๊น์ง 1๋ฒ๋ถํฐ ๋ฌดํ๋๊น์ง(+) ํํ
re.match("[0-9a-zA-Z-]{0,}", "A-10521 IronMan Mark II").group()
# 0~9, a~z, A~Z, - ์ผ๋๊น์ง 0๋ฒ๋ถํฐ ๋ฌดํ๋๊น์ง({0,}) ํํ
re.match("[0-9a-zA-Z-]{0,7}", "A-10521 IronMan Mark II").group()
# 0~9, a~z, A~Z, - ์ผ๋๊น์ง 0๋ฒ๋ถํฐ 7๋ฒ๊น์ง({0,7}) ํํ
re.match(".{0,7}", "A-10521 IronMan Mark II").group()
# ์ค๋ฐ๊ฟ์ ์ ์ธํ ๋ชจ๋ ๋ฌธ์(.)๊น์ง 0๋ฒ๋ถํฐ 7๋ฒ๊น์ง({0,7}) ํํ
fullmatch()
match() ๊ฐ์ ๊ฒฝ์ฐ ๋ฌธ์์ด์ ์ฒซ๋ฒ์งธ ์ธ๋ฑ์ค๋ง ๋ง์ผ๋ฉด ๋์ง๋ง, fullmatch() ๋ ๋ง์ง๋ง๋ ์ผ์นํด์ผํฉ๋๋ค.
re.fullmatch("A-10521 IronMan Mark II","A-10521 IronMan Mark II").group()
# A-10521 IronMan Mark II
re.fullmatch("[0-9a-zA-Z- ]+","A-10521 IronMan Mark II").group()
# A-10521 IronMan Mark II
re.fullmatch("[0-9a-zA-Z- ]+","A-10521 IronMan Mark II?")
# None
# ๋ฌธ์์ด ๊ฐ์ฅ ๋ค์ ? ๊ฐ ์๋๋ฐ ํจํด์๋ ? ์ฒ๋ฆฌ๊ฐ ์๊ธฐ ๋๋ฌธ์ None ์ฒ๋ฆฌ
findall()
๋ฌธ์์ด ์์ ํจํด๊ณผ ์ผ์นํ๋ ๊ฐ๋ค์ ์ ๋ถ ์ฐพ์์ ๋ฆฌ์คํธ๋ก ๋ฐํํฉ๋๋ค.
re.findall("\d", "A-10521 IronMan Mark II")
# ['1', '0', '5', '2', '1']
# \d ์ {} ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ซ์๋ฅผ ํ๋์ฉ ์ฐพ์์ ๋ฆฌ์คํธ๋ก ๋ฐํ
re.findall("\d+", "A-10521 IronMan Mark II")
# ['10521']
# \d ์ + ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ซ์๋ฅผ ์ฐพ์ ๋ค์ ์ซ์๊ฐ ์๋๋๊น์ง ์ฐพ๋ ๊ฒ์ ๋ฐ๋ณตํ๊ณ ๋ฆฌ์คํธ๋ก ๋ฐํ
re.findall("\d+", "A-10521 B-20179 IronMan Mark II")
# ['10521', '20179']
# \d ์ + ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ซ์๊ฐ ์๋๋๊น์ง ์ฐพ์ ๋ค์ ์ซ์๊ฐ ์๋๋๊น์ง ์ฐพ๋ ๊ฒ์ ๋ฐ๋ณตํ๊ณ ๋ฆฌ์คํธ๋ก ๋ฐํ
re.findall("\w+", "A-10521 IronMan Mark II"
# ['A', '10521', 'IronMan', 'Mark', 'II']
# ์ค๋ฐ๊ฟ์ ์ ์ธํ๊ณ ๋ฌธ์๋ ์ซ์๊ฐ ์๋๋๊น์ง ์ฐพ์ ๋ค์ ๋ฆฌ์คํธ๋ก ๋ฐํ
finditer()
findall() ๊ณผ ๋น์ทํ์ง๋ง ๋ฆฌ์คํธ๊ฐ ์๋ iterator ๋ก ๋ฐํํฉ๋๋ค.
for i in re.finditer("\w+", "A-10521 IronMan Mark II"):
print(i.group())
# A
# 10521
# IronMan
# Mark
# II
sub()
๋ฌธ์์ด์์ ์ด๋ค ๋ฌธ์๋ฅผ ์ด๋ค ๋ฌธ์๋ก ๋ฐ๊ฟ ๊ฒ์ธ์ง๋ฅผ ์ฐพ์ ๋ฌธ์์ด์ ๋ฐํํฉ๋๋ค.
print(re.sub("I","K", "A-10521 IronMan Mark II"))
# A-10521 KronMan Mark KK
# I ๋ฅผ ๋ชจ๋ ์ฐพ์์ K ๋ก ๋ณํ
print(re.sub("I","K", "A-10521 IronMan Mark II", 1))
# A-10521 KronMan Mark II
# I ๋ฅผ 1๊ฐ๋ง ์ฐพ์์ K ๋ก ๋ณํ
print(re.sub("[A-Z]+","&", "A-10521 IronMan Mark II"))
# &-10521 &ron&an &ark &
# A ~ Z ๋ฌธ์์ด์ ์ฐพ์ & ๋ก ๋ณํ
print(re.sub("[A-Z]+","&", "A-10521 IronMan Mark II", 1))
# &-10521 IronMan Mark II
# A ~ Z ๋ฌธ์์ด์ ์ฐพ์ 1๊ฐ๋ง & ๋ก ๋ณํ
subn()
sub() ์ ์ ์ฌํ์ง๋ง ๋ณํ๋ ๋ฌธ์์ด๋ฟ๋ง ์๋๋ผ ๋ฐ๊พผ ๊ฐฏ์๊น์ง ํํ๋ก ๋ฐํํฉ๋๋ค.
re.subn("I", "K", "A-10521 IronMan Mark II")
# ('A-10521 KronMan Mark KK', 3)
re.subn("I", "K", "A-10521 IronMan Mark II", 1)
# ('A-10521 KronMan Mark II', 1)
re.subn("[A-Z]+","&", "A-10521 IronMan Mark II")
# ('&-10521 &ron&an &ark &', 5)
re.subn("[A-Z]+","&", "A-10521 IronMan Mark II", 1)
# ('&-10521 IronMan Mark II', 1)
split()
๋ฌธ์์ด์์ ์ฃผ์ด์ง ํจํด์ผ๋ก split ํ ํ ๋ฆฌ์คํธ๋ก ๋ฐํํฉ๋๋ค.
print(re.split("A", "A-10521 IronMan Mark II"))
# ['', '-10521 IronMan Mark II']
print(re.split("[a-zA-Z]+", "A-10521 IronMan Mark II"))
# ['', '-10521 ', ' ', ' ', '']
print(re.split("[a-zA-Z]+", "A-10521 IronMan Mark II", 1))
# ['', '-10521 IronMan Mark II']
ํจ์๋ค์ด ์ด๋ป๊ฒ ๋์ํ๋์ง ์์ ์ ํ๋ฒ ์ดํด๋ณด์๋๋ฐ์.
์ค์ ๋ฌธ์ ์ ์ด๋ป๊ฒ ์ ์ฉํ๋์ง ์์๋ณด์ฃ !
๋ฌธ์ ํ์ด
๋ฌธ์ ๋ 2018 KAKAO BLIND [3์ฐจ] ํ์ผ๋ช ์ ๋ ฌ ์ ๋๋ค.
๋ฌธ์ ์ ๋ํ ์ค๋ช ์ ์๋ตํ๊ฒ ์ต๋๋ค.
๋ฌธ์ ์กฐ๊ฑด
- HEAD ๋ ๋์๋ฌธ์ ๊ตฌ๋ถ X, ๋ฌธ์๋ง
- NUMBER ๋ 1~5 ๊ธ, ์์ 0์ด ์ฌ ์ ์์
- TAIL ์ ๋น ๋ฌธ์์ด์ผ ์ ์๊ณ , ์ซ์๋ ๋ฌธ์๊ฐ ์์
- HEAD ๋ถ๋ถ๊ณผ, NUMBER์ ์ซ์๋ ๊ฐ์ ๊ฒฝ์ฐ, ๊ทธ๋ฅ ๋ค์ด์ค๋ ์์๋๋ก
- 0 ์ ๊ฐฏ์๋ง ๋ค๋ฅธ ์ค๋ณต๋ ํ ์คํธ๊ฐ ์์ ์ ์์
import re
def solution(files):
return sorted(files, key=lambda file: (find_head_and_number(file)))
def find_head_and_number(file):
head, number, tail = re.match("([a-zA-Z-. ]+)(\d{1,5})(.*)", file).groups()
return [head.lower(), int(number)]
์ฌ๊ธฐ์ ํต์ฌ ์ฝ๋๋ ์ด๊ฒ๋๋ค.
re.match("([a-zA-Z-. ]+)(\d{1,5})(.*)", file).groups()
re.match ๋ฅผ ์ฌ์ฉํ์ฌ ์ฒ์๋ถํฐ ํจํด๊ณผ ์ผ์นํ๋ ์ง ์ดํด๋ณด๊ฒ ๋๋๋ฐ,
-, . ๋ฅผ ํฌํจํ ๋ฌธ์์ด์ ์ฐพ๊ณ , ๊ทธ ํ์ 1~5๊ฐ๊น์ง์ ์ซ์๋ฅผ ์ฐพ์ ํ, ๊ทธ ํ์ ๋น ๋ฌธ์๋ ์๋ฌด ๋ฌธ์๋ฅผ ์ฐพ์ ๋ค์ groups() ๋ฅผ ์ด์ฉํด์ ํํ๋ก ๋ฐํํฉ๋๋ค.
๋๋จธ์ง๋ ์์๋ฆฌ๋ผ ๋ฏฟ๊ณ ๋ฐ๋ก ์ค๋ช ํ์ง ์๊ฒ ์ต๋๋ค.
re ๋ชจ๋์ ์ด์ฉํ๋ฉด ๋ฌธ์์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋๋ฐ ๋ง์ ๋์์ด ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๊ทธ๋ผ ์ค๋์ ์ฌ๊ธฐ๊น์ง!
'์๊ณ ๋ฆฌ์ฆ > ์ ์ฉํ ํ์ด์ฌ ํจ์' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Python] Counter ๋ชจ๋ ์ฌ์ฉ๋ฒ feat. ์นด์นด์ค ํํ (0) | 2023.03.12 |
---|