ํŒŒ์ด์ฌ ์ •๊ทœํ‘œํ˜„์‹ ์ •๋ฆฌ (1)
Problem Solving ๐Ÿ”ฅ/์•Œ๊ณ ๋ฆฌ์ฆ˜, ์ˆ˜ํ•™

ํŒŒ์ด์ฌ ์ •๊ทœํ‘œํ˜„์‹ ์ •๋ฆฌ (1)

๋‹ค์Œ์€ ์ ํ”„ํˆฌ ํŒŒ์ด์ฌ wikidocs.net/1669์˜ ์ •๊ทœํ‘œํ˜„์‹ ๋‚ด์šฉ์„ ์กฐ๊ธˆ ๋” ๊ฐ„๋žตํ™” ํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

๋ฌธ์ž ํด๋ž˜์Šค [ ]

"[] ์‚ฌ์ด์˜ ๋ฌธ์ž๋“ค๊ณผ ๋งค์น˜"

[abc]๋ผ๋ฉด, "a,b,c ์ค‘ ํ•œ ๊ฐœ์˜ ๋ฌธ์ž์™€ ๋งค์น˜"

์•ˆ์— ํ•˜์ดํ”ˆ(-)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, From - To๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

[0-5]๋Š” [012345]์™€ ๋™์ผํ•˜๋‹ค.

[a-zA-Z], "์•ŒํŒŒ๋ฒณ ๋ชจ๋‘"

๋ฌธ์ž ํด๋ž˜์Šค([])์— ^๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ not๋ผ๋Š” ์˜๋ฏธ๋ฅผ ๊ฐ–๋Š”๋‹ค.

์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ์ž ํด๋ž˜์Šค

\d - ์ˆซ์ž์™€ ๋งค์น˜, [0-9]์™€ ๋™์ผํ•˜๋‹ค

\D - ์ˆซ์ž๊ฐ€ ์•„๋‹Œ ๊ฒƒ๊ณผ ๋งค์น˜, [^0-9]์™€ ๋™์ผ

\s - space์™€ ๋งค์น˜

\S - space๊ฐ€ ์•„๋‹Œ ๊ฒƒ๊ณผ ๋งค์น˜

\w - ๋ฌธ์ž+์ˆซ์ž์™€ ๋งค์น˜, [a-zA-Z0-9_]์™€ ๋™์ผํ•˜๋‹ค.

\W - ๋ฌธ์ž+์ˆซ์ž๊ฐ€ ์•„๋‹Œ ๊ฒƒ๊ณผ ๋งค์น˜

Dot(.)

\n์„ ์ œ์™ธํ•œ ๋ชจ๋“  ๋ฌธ์ž์™€ ๋งค์น˜๋œ๋‹ค.

"a + ๋ชจ๋“ ๋ฌธ์ž + b"

"aab", "a0b", "abc" ์ค‘ "aab", "a0b"๋Š” ์ •๊ทœ์‹ a.b์™€ ๋งค์น˜๋˜๊ณ , "abc"๋Š” ๋งค์น˜๋˜์ง€ ์•Š๋Š”๋‹ค.

์ •๊ทœ์‹ a\[.\]b๋Š” "a.b"์™€ ๋งค์น˜๋˜๊ณ , "a0b"์™€๋Š” ๋งค์น˜๋˜์ง€ ์•Š๋Š”๋‹ค.

๋ฐ˜๋ณต \, +, {}*

*, + ๋‘˜ ๋‹ค ๋ฐ˜๋ณต์„ ์˜๋ฏธํ•˜์ง€๋งŒ, +์˜ ๊ฒฝ์šฐ ์ตœ์†Œ 1๋ฒˆ ์ด์ƒ ๋ฐ˜๋ณต๋  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

ca*t ⇒ ct, cat, caat, caaat....

์—ฌ๊ธฐ์—์„œ ์ž ๊น ์ƒ๊ฐํ•ด ๋ณผ ๊ฒŒ ์žˆ๋‹ค. ๋ฐ˜๋ณต ํšŸ์ˆ˜๋ฅผ 3ํšŒ๋งŒ ๋˜๋Š” 1ํšŒ๋ถ€ํ„ฐ 3ํšŒ๊นŒ์ง€๋งŒ์œผ๋กœ ์ œํ•œํ•˜๊ณ  ์‹ถ์„ ์ˆ˜๋„ ์žˆ์ง€ ์•Š์„๊นŒ?

{3,}์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ˜๋ณต ํšŸ์ˆ˜๊ฐ€ 3 ์ด์ƒ์ธ ๊ฒฝ์šฐ์ด๊ณ  {,3}์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ˜๋ณต ํšŸ์ˆ˜๊ฐ€ 3 ์ดํ•˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์ƒ๋žต๋œ m์€ 0๊ณผ ๋™์ผํ•˜๋ฉฐ, ์ƒ๋žต๋œ n์€ ๋ฌดํ•œ๋Œ€(2์–ต ๊ฐœ ๋ฏธ๋งŒ)์˜ ์˜๋ฏธ๋ฅผ ๊ฐ–๋Š”๋‹ค.

โ€ป {1,}์€ +์™€ ๋™์ผํ•˜๊ณ , {0,}์€ *์™€ ๋™์ผํ•˜๋‹ค.

{ }์„ ์‚ฌ์šฉํ•œ ๋ช‡ ๊ฐ€์ง€ ์ •๊ทœ์‹์„ ์‚ดํŽด๋ณด์ž.

1. {}

ca{2}t ์ •๊ทœ์‹์˜ ์˜๋ฏธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

"c + a(๋ฐ˜๋“œ์‹œ 2๋ฒˆ ๋ฐ˜๋ณต) + t"

  1. ca{2,5}t ⇒ caat, caaat, caaaat, caaaat ์™€ ๋งค์น˜๋œ๋‹ค.

๋ฐ˜๋ณต์€ ์•„๋‹ˆ์ง€๋งŒ ์ด์™€ ๋น„์Šทํ•œ ๊ฐœ๋…์œผ๋กœ ? ์ด ์žˆ๋‹ค. ? ๋ฉ”ํƒ€๋ฌธ์ž๊ฐ€ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์€ {0, 1} ์ด๋‹ค.

๋‹ค์Œ ์ •๊ทœ์‹์„ ๋ณด์ž.

ab?c "a + b(์žˆ์–ด๋„ ๋˜๊ณ  ์—†์–ด๋„ ๋œ๋‹ค) + c"

ํŒŒ์ด์ฌ์—์„œ ์ •๊ทœ ํ‘œํ˜„์‹์„ ์ง€์›ํ•˜๋Š” re ๋ชจ๋“ˆ

import re
p = re.compile('ab\*')

re.compile์„ ์‚ฌ์šฉํ•˜์—ฌ ์ •๊ทœ ํ‘œํ˜„์‹(์œ„ ์˜ˆ์—์„œ๋Š” ab\*)์„ ์ปดํŒŒ์ผํ•œ๋‹ค. re.compile์˜ ๊ฒฐ๊ณผ๋กœ ๋Œ๋ ค์ฃผ๋Š” ๊ฐ์ฒด p(์ปดํŒŒ์ผ๋œ ํŒจํ„ด ๊ฐ์ฒด)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ทธ ์ดํ›„์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๊ฒƒ์ด๋‹ค.

์ปดํŒŒ์ผ ๋œ ๊ฐ์ฒด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

์ •๊ทœ์‹์„ ์ด์šฉํ•œ ๋ฌธ์ž์—ด ๊ฒ€์ƒ‰

์ด์ œ ์ปดํŒŒ์ผ๋œ ํŒจํ„ด ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ž์—ด ๊ฒ€์ƒ‰์„ ์ˆ˜ํ–‰ํ•ด ๋ณด์ž. ์ปดํŒŒ์ผ๋œ ํŒจํ„ด ๊ฐ์ฒด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ 4๊ฐ€์ง€ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

match() ๋ฌธ์ž์—ด์˜ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ •๊ทœ์‹๊ณผ ๋งค์น˜๋˜๋Š”์ง€ ์กฐ์‚ฌํ•œ๋‹ค.
search() ๋ฌธ์ž์—ด ์ „์ฒด๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ ์ •๊ทœ์‹๊ณผ ๋งค์น˜๋˜๋Š”์ง€ ์กฐ์‚ฌํ•œ๋‹ค.
findall() ์ •๊ทœ์‹๊ณผ ๋งค์น˜๋˜๋Š” ๋ชจ๋“  ๋ฌธ์ž์—ด(substring)์„ ๋ฆฌ์ŠคํŠธ๋กœ ๋Œ๋ ค์ค€๋‹ค.
finditer() ์ •๊ทœ์‹๊ณผ ๋งค์น˜๋˜๋Š” ๋ชจ๋“  ๋ฌธ์ž์—ด(substring)์„ ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด๋กœ ๋Œ๋ ค์ค€๋‹ค.

match, search๋Š” ์ •๊ทœ์‹๊ณผ ๋งค์น˜๋  ๋•Œ๋Š” match ๊ฐ์ฒด๋ฅผ ๋Œ๋ ค์ฃผ๊ณ , ๋งค์น˜๋˜์ง€ ์•Š์„ ๋•Œ๋Š” None์„ ๋Œ๋ ค์ค€๋‹ค. ์ด๋“ค ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ์˜ˆ๋ฅผ ์‚ดํŽด๋ณด์ž.

โ€ป match ๊ฐ์ฒด๋ž€ ์ •๊ทœ์‹์˜ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋กœ ๋Œ๋ ค์ฃผ๋Š” ๊ฐ์ฒด์ด๋‹ค.

์šฐ์„  ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŒจํ„ด์„ ๋งŒ๋“ค์–ด ๋ณด์ž.


import re
p = re.compile('\[a-z\]+')

import re
p = re.compile('\[a-z\]+') 
m = p.match("python") 
>>> print(m) 
<\_sre.SRE\_Match object at 0x01F3F9F8>

๋งŒ์•ฝ ์ •๊ทœํ‘œํ˜„์‹๊ณผ ๋ฌธ์ž์—ด์ด ๋งค์น˜ํ•œ๋‹ค๋ฉด, Match ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

match ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ

์ž, ์ด์ œ match ๋ฉ”์„œ๋“œ์™€ search ๋ฉ”์„œ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ๋Œ๋ ค์ค€ match ๊ฐ์ฒด์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž. ์•ž์—์„œ ์ •๊ทœ์‹์„ ์‚ฌ์šฉํ•œ ๋ฌธ์ž์—ด ๊ฒ€์ƒ‰์„ ์ˆ˜ํ–‰ํ•˜๋ฉด์„œ ์•„๋งˆ๋„ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ถ๊ธˆ์ฆ์ด ์ƒ๊ฒผ์„ ๊ฒƒ์ด๋‹ค.

  • ์–ด๋–ค ๋ฌธ์ž์—ด์ด ๋งค์น˜๋˜์—ˆ๋Š”๊ฐ€?
  • ๋งค์น˜๋œ ๋ฌธ์ž์—ด์˜ ์ธ๋ฑ์Šค๋Š” ์–ด๋””์„œ๋ถ€ํ„ฐ ์–ด๋””๊นŒ์ง€์ธ๊ฐ€?

match ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด ๊ฐ™์€ ๊ถ๊ธˆ์ฆ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค์Œ ํ‘œ๋ฅผ ๋ณด์ž.

group() ๋งค์น˜๋œ ๋ฌธ์ž์—ด์„ ๋Œ๋ ค์ค€๋‹ค.
start() ๋งค์น˜๋œ ๋ฌธ์ž์—ด์˜ ์‹œ์ž‘ ์œ„์น˜๋ฅผ ๋Œ๋ ค์ค€๋‹ค.
end() ๋งค์น˜๋œ ๋ฌธ์ž์—ด์˜ ๋ ์œ„์น˜๋ฅผ ๋Œ๋ ค์ค€๋‹ค.
span() ๋งค์น˜๋œ ๋ฌธ์ž์—ด์˜ (์‹œ์ž‘, ๋)์— ํ•ด๋‹นํ•˜๋Š” ํŠœํ”Œ์„ ๋Œ๋ ค์ค€๋‹ค.

๋‹ค์Œ ์˜ˆ๋กœ ํ™•์ธํ•ด ๋ณด์ž.

m = p.match("python") 
>>> m.group() 'python' 
>>> m.start() 0 
>>> m.end() 6 
>>> m.span() (0, 6)

[๋ชจ๋“ˆ ๋‹จ์œ„๋กœ ์ˆ˜ํ–‰ํ•˜๊ธฐ]

์ง€๊ธˆ๊นŒ์ง€ ์šฐ๋ฆฌ๋Š” re.compile์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํŒŒ์ผ๋œ ํŒจํ„ด ๊ฐ์ฒด๋กœ ๊ทธ ์ดํ›„์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ๋‹ค. re ๋ชจ๋“ˆ์€ ์ด๊ฒƒ์„ ์ข€ ์ถ•์•ฝํ•œ ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค. ๋‹ค์Œ ์˜ˆ๋ฅผ ๋ณด์ž.

>>> p = re.compile('\[a-z\]+') 
>>> m = p.match("python")

์œ„ ์ฝ”๋“œ๊ฐ€ ์ถ•์•ฝ๋œ ํ˜•ํƒœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

>>> m = re.match('\[a-z\]+', "python")

์œ„ ์˜ˆ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํŒŒ์ผ๊ณผ match ๋ฉ”์„œ๋“œ๋ฅผ ํ•œ ๋ฒˆ์— ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ณดํ†ต ํ•œ ๋ฒˆ ๋งŒ๋“  ํŒจํ„ด ๊ฐ์ฒด๋ฅผ ์—ฌ๋Ÿฌ๋ฒˆ ์‚ฌ์šฉํ•ด์•ผ ํ•  ๋•Œ๋Š” ์ด ๋ฐฉ๋ฒ•๋ณด๋‹ค re.compile์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํŽธํ•˜๋‹ค.

๋ฉ”ํƒ€ ๋ฌธ์ž

^

^ ๋ฉ”ํƒ€ ๋ฌธ์ž๋Š” ๋ฌธ์ž์—ด์˜ ๋งจ ์ฒ˜์Œ๊ณผ ์ผ์น˜ํ•จ์„ ์˜๋ฏธํ•œ๋‹ค.

์ •๊ทœ์‹ ^python\s\w+์€ python์ด๋ผ๋Š” ๋ฌธ์ž์—ด๋กœ ์‹œ์ž‘ํ•˜๊ณ  ๊ทธ ๋’ค์— whitespace, ๊ทธ ๋’ค์— ๋‹จ์–ด๊ฐ€ ์™€์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. ๊ฒ€์ƒ‰ํ•  ๋ฌธ์ž์—ด data๋Š” ์—ฌ๋Ÿฌ ์ค„๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.

re.search('^Life', 'Life is too short')

|

| ๋ฉ”ํƒ€ ๋ฌธ์ž๋Š” or๊ณผ ๋™์ผํ•œ ์˜๋ฏธ๋กœ ์‚ฌ์šฉ๋œ๋‹ค. A|B๋ผ๋Š” ์ •๊ทœ์‹์ด ์žˆ๋‹ค๋ฉด A ๋˜๋Š” B๋ผ๋Š” ์˜๋ฏธ๊ฐ€ ๋œ๋‹ค.

p = re.compile('Crow|Servo')

$

$ ๋ฉ”ํƒ€ ๋ฌธ์ž๋Š” ^ ๋ฉ”ํƒ€ ๋ฌธ์ž์™€ ๋ฐ˜๋Œ€์˜ ๊ฒฝ์šฐ์ด๋‹ค. ์ฆ‰ $๋Š” ๋ฌธ์ž์—ด์˜ ๋๊ณผ ๋งค์น˜ํ•จ์„ ์˜๋ฏธํ•œ๋‹ค.

re.search('short$', 'Life is too short')

\A

\\A๋Š” ๋ฌธ์ž์—ด์˜ ์ฒ˜์Œ๊ณผ ๋งค์น˜๋จ์„ ์˜๋ฏธํ•œ๋‹ค. ^ ๋ฉ”ํƒ€ ๋ฌธ์ž์™€ ๋™์ผํ•œ ์˜๋ฏธ์ด์ง€๋งŒ re.MULTILINE ์˜ต์…˜์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ์—๋Š” ๋‹ค๋ฅด๊ฒŒ ํ•ด์„๋œ๋‹ค. re.MULTILINE ์˜ต์…˜์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ^์€ ๊ฐ ์ค„์˜ ๋ฌธ์ž์—ด์˜ ์ฒ˜์Œ๊ณผ ๋งค์น˜๋˜์ง€๋งŒ \\A๋Š” ์ค„๊ณผ ์ƒ๊ด€์—†์ด ์ „์ฒด ๋ฌธ์ž์—ด์˜ ์ฒ˜์Œํ•˜๊ณ ๋งŒ ๋งค์น˜๋œ๋‹ค.

\Z

\\Z๋Š” ๋ฌธ์ž์—ด์˜ ๋๊ณผ ๋งค์น˜๋จ์„ ์˜๋ฏธํ•œ๋‹ค. ์ด๊ฒƒ ์—ญ์‹œ \\A์™€ ๋™์ผํ•˜๊ฒŒ re.MULTILINE ์˜ต์…˜์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ $ ๋ฉ”ํƒ€ ๋ฌธ์ž์™€๋Š” ๋‹ฌ๋ฆฌ ์ „์ฒด ๋ฌธ์ž์—ด์˜ ๋๊ณผ ๋งค์น˜๋œ๋‹ค.

\b

\\b๋Š” ๋‹จ์–ด ๊ตฌ๋ถ„์ž(Word boundary)์ด๋‹ค. ๋ณดํ†ต ๋‹จ์–ด๋Š” whitespace์— ์˜ํ•ด ๊ตฌ๋ถ„๋œ๋‹ค.

๋‹ค์Œ ์˜ˆ๋ฅผ ๋ณด์ž.

>>> p = re.compile(r'\\\\bclass\\\\b')
>>> print(p.search('no class at all')) 
<re.Match object; span=(3, 8), match='class'>

\\bclass\\b ์ •๊ทœ์‹์€ ์•ž๋’ค๊ฐ€ whitespace๋กœ ๊ตฌ๋ถ„๋œ class๋ผ๋Š” ๋‹จ์–ด์™€ ๋งค์น˜๋จ์„ ์˜๋ฏธํ•œ๋‹ค. ๋”ฐ๋ผ์„œ no class at all์˜ class๋ผ๋Š” ๋‹จ์–ด์™€ ๋งค์น˜๋จ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

>>> print(p.search('the declassified algorithm')) 
None

์œ„ ์˜ˆ์˜ the declassified algorithm ๋ฌธ์ž์—ด ์•ˆ์—๋„ class ๋ฌธ์ž์—ด์ด ํฌํ•จ๋˜์–ด ์žˆ๊ธด ํ•˜์ง€๋งŒ whitespace๋กœ ๊ตฌ๋ถ„๋œ ๋‹จ์–ด๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ๋งค์น˜๋˜์ง€ ์•Š๋Š”๋‹ค.

\B

\\B ๋ฉ”ํƒ€ ๋ฌธ์ž๋Š” \\b ๋ฉ”ํƒ€ ๋ฌธ์ž์™€ ๋ฐ˜๋Œ€์˜ ๊ฒฝ์šฐ์ด๋‹ค. ์ฆ‰ whitespace๋กœ ๊ตฌ๋ถ„๋œ ๋‹จ์–ด๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ์—๋งŒ ๋งค์น˜๋œ๋‹ค.

>>> p = re.compile(r'\\\\Bclass\\\\B') 
>>> print(p.search('no class at all')) 
None
>>> print(p.search('the declassified algorithm')) 
<re.Match object; span=(6, 11), match='class'>