๋กœ์ผ“๐Ÿพ
article thumbnail
๋ฐ˜์‘ํ˜•

 

ํŒŒ์ด์ฌ์—์„œ ๋ฌธ์ž์—ด์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ์ฃ . ๊ทธ ์ค‘ ์ •๊ทœํ‘œํ˜„์‹์„ ์ด์šฉํ•˜๋ฉด ์ข€ ๋” ๋‹ค์–‘ํ•˜๊ณ  ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ํŒŒ์ด์ฌ์—์„œ ์œ ์šฉํ•œ ๋ชจ๋“ˆ ์ค‘ ์ •๊ทœ์‹์„ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” 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์ฐจ] ํŒŒ์ผ๋ช… ์ •๋ ฌ ์ž…๋‹ˆ๋‹ค.

๋ฌธ์ œ์— ๋Œ€ํ•œ ์„ค๋ช…์€ ์ƒ๋žตํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

๋ฌธ์ œ ์กฐ๊ฑด

  1. HEAD ๋Š” ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ X, ๋ฌธ์ž๋งŒ
  2. NUMBER ๋Š” 1~5 ๊ธ€, ์•ž์— 0์ด ์˜ฌ ์ˆ˜ ์žˆ์Œ
  3. TAIL ์€ ๋นˆ ๋ฌธ์ž์—ด์ผ ์ˆ˜ ์žˆ๊ณ , ์ˆซ์ž๋ž‘ ๋ฌธ์ž๊ฐ€ ์„ž์ž„
  4. HEAD ๋ถ€๋ถ„๊ณผ, NUMBER์˜ ์ˆซ์ž๋„ ๊ฐ™์„ ๊ฒฝ์šฐ, ๊ทธ๋ƒฅ ๋“ค์–ด์˜ค๋Š” ์ˆœ์„œ๋Œ€๋กœ
  5. 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 ๋ชจ๋“ˆ์„ ์ด์šฉํ•˜๋ฉด ๋ฌธ์ž์—ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š”๋ฐ ๋งŽ์€ ๋„์›€์ด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿผ ์˜ค๋Š˜์€ ์—ฌ๊ธฐ๊นŒ์ง€!

๋ฐ˜์‘ํ˜•
profile on loading

Loading...