๊ฐœ์š”

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

>>> p = re.compile(".+:")
>>> m = p.search("http://google.com")
>>> print(m.group())
http:

์ •๊ทœ์‹ .+:๊ณผ ์ผ์น˜ํ•˜๋Š” ๋ฌธ์ž์—ด๋กœ http:๋ฅผ ๋Œ๋ ค์ฃผ์—ˆ๋‹ค. ๋งŒ์•ฝ http:๋ผ๋Š” ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์—์„œ :์„ ์ œ์™ธํ•˜๊ณ  ์ถœ๋ ฅํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ? ์œ„ ์˜ˆ๋Š” ๊ทธ๋‚˜๋งˆ ๊ฐ„๋‹จํ•˜์ง€๋งŒ ํ›จ์”ฌ ๋ณต์žกํ•œ ์ •๊ทœ์‹์ด์–ด์„œ ๊ทธ๋ฃจํ•‘์€ ์ถ”๊ฐ€๋กœ ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์กฐ๊ฑด๊นŒ์ง€ ๋”ํ•ด์ง„๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ?

์ด๋Ÿด ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ ์ „๋ฐฉ ํƒ์ƒ‰์ด๋‹ค. ์ „๋ฐฉ ํƒ์ƒ‰์—๋Š” ๊ธ์ •(Positive)๊ณผ ๋ถ€์ •(Negative)์˜ 2์ข…๋ฅ˜๊ฐ€ ์žˆ๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œํ˜„ํ•œ๋‹ค.

  1. ๊ธ์ •ํ˜• ์ „๋ฐฉ ํƒ์ƒ‰((?=...)) - ... ์— ํ•ด๋‹น๋˜๋Š” ์ •๊ทœ์‹๊ณผ ๋งค์น˜๋˜์–ด์•ผ ํ•˜๋ฉฐ ์กฐ๊ฑด์ด ํ†ต๊ณผ๋˜์–ด๋„ ๋ฌธ์ž์—ด์ด ์†Œ๋น„๋˜์ง€ ์•Š๋Š”๋‹ค.
  2. ๋ถ€์ •ํ˜• ์ „๋ฐฉ ํƒ์ƒ‰((?!...)) - ...์— ํ•ด๋‹น๋˜๋Š” ์ •๊ทœ์‹๊ณผ ๋งค์น˜๋˜์ง€ ์•Š์•„์•ผ ํ•˜๋ฉฐ ์กฐ๊ฑด์ด ํ†ต๊ณผ๋˜์–ด๋„ ๋ฌธ์ž์—ด์ด ์†Œ๋น„๋˜์ง€ ์•Š๋Š”๋‹ค.

๊ธ์ •ํ˜• ์ „๋ฐฉ ํƒ์ƒ‰

๊ธ์ •ํ˜• ์ „๋ฐฉ ํƒ์ƒ‰์„ ์‚ฌ์šฉํ•˜๋ฉด http:์˜ ๊ฒฐ๊ณผ๋ฅผ http๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.

>>> p = re.compile(".+(?=:)")
>>> m = p.search("http://google.com")
>>> print(m.group())
http

์ •๊ทœ์‹ ์ค‘ :์— ํ•ด๋‹นํ•˜๋Š” ๋ถ€๋ถ„์— ๊ธ์ •ํ˜• ์ „๋ฐฉ ํƒ์ƒ‰ ๊ธฐ๋ฒ•์„ ์ ์šฉํ•˜์—ฌ (?=:)์œผ๋กœ ๋ณ€๊ฒฝํ•˜์˜€๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ๊ธฐ์กด ์ •๊ทœ์‹๊ณผ ๊ฒ€์ƒ‰์—์„œ๋Š” ๋™์ผํ•œ ํšจ๊ณผ๋ฅผ ๋ฐœํœ˜ํ•˜์ง€๋งŒ : ์— ํ•ด๋‹นํ•˜๋Š” ๋ฌธ์ž์—ด์ด ์ •๊ทœ์‹ ์—”์ง„์— ์˜ํ•ด ์†Œ๋น„๋˜์ง€ ์•Š์•„(๊ฒ€์ƒ‰์—๋Š” ํฌํ•จ๋˜์ง€๋งŒ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์—๋Š” ์ œ์™ธ๋จ) ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์—์„œ๋Š” :์ด ์ œ๊ฑฐ๋œ ํ›„ ๋Œ๋ ค์ฃผ๋Š” ํšจ๊ณผ๊ฐ€ ์žˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์•Œ ์ˆ˜ ์žˆ๋Š” ์‚ฌ์‹ค์€, Lookahead Assertions์ด zero-width assertion์ด๋ผ๋Š” ์‚ฌ์‹ค์ด๋‹ค. ์‹ค์ œ ๊ฒ€์ƒ‰์— ์ ์šฉ๋˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์—”์ง„์ด ์ด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•˜๋Š”๋ฐ ๊ทธ๋ ‡์ง€๋Š” ์•Š๊ณ , ๊ทธ์ € ์žˆ๋Š”์ง€ ํ™•์ธ๋งŒ ํ•ด์ฃผ๋Š” ์—ญํ• ์ด๋‹ค. ์ด๋ฅผ ์†Œ๋น„๋œ๋‹ค ๋ผ๋Š” ํ‘œํ˜„์œผ๋กœ ์ ์—ˆ๋‹ค๋Š” ๊ฒƒ์€ ์•ž ๊ธ€์—์„œ ๋ฐฐ์› ๋‹ค.

๋ถ€์ •์  ์ „๋ฐฉ ํƒ์ƒ‰

์ž, ์ด๋ฒˆ์—๋Š” ๋‹ค์Œ ์ •๊ทœ์‹์„ ๋ณด์ž.

.*[.].*$

์ด ์ •๊ทœ์‹์€ ํŒŒ์ผ ์ด๋ฆ„ + . + ํ™•์žฅ์ž๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •๊ทœ์‹์ด๋‹ค. ์ด ์ •๊ทœ์‹์€ foo.bar, autoexec.bat, sendmail.cf ๊ฐ™์€ ํ˜•์‹์˜ ํŒŒ์ผ๊ณผ ๋งค์น˜๋  ๊ฒƒ์ด๋‹ค.

์ด ์ •๊ทœ์‹์— ํ™•์žฅ์ž๊ฐ€ โ€œbat์ธ ํŒŒ์ผ์€ ์ œ์™ธํ•ด์•ผ ํ•œ๋‹คโ€๋Š” ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•ด ๋ณด์ž. ๊ฐ€์žฅ ๋จผ์ € ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ์ •๊ทœ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

.*[.][^b].*$

์ด ์ •๊ทœ์‹์€ | ๋ฉ”ํƒ€ ๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ™•์žฅ์ž์˜ ์ฒซ ๋ฒˆ์งธ ๋ฌธ์ž๊ฐ€ b๊ฐ€ ์•„๋‹ˆ๊ฑฐ๋‚˜ ๋‘ ๋ฒˆ์งธ ๋ฌธ์ž๊ฐ€ a๊ฐ€ ์•„๋‹ˆ๊ฑฐ๋‚˜ ์„ธ ๋ฒˆ์งธ ๋ฌธ์ž๊ฐ€ t๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์ด ์ •๊ทœ์‹์— ์˜ํ•˜์—ฌ foo.bar๋Š” ์ œ์™ธ๋˜์ง€ ์•Š๊ณ  autoexec.bat์€ ์ œ์™ธ๋˜์–ด ๋งŒ์กฑ์Šค๋Ÿฌ์šด ๊ฒฐ๊ณผ๋ฅผ ๋Œ๋ ค์ค€๋‹ค. ํ•˜์ง€๋งŒ ์ด ์ •๊ทœ์‹์€ sendmail.cf์ฒ˜๋Ÿผ ํ™•์žฅ์ž์˜ ๋ฌธ์ž ๊ฐœ์ˆ˜๊ฐ€ 2๊ฐœ์ธ ์ผ€์ด์Šค๋ฅผ ํฌํ•จํ•˜์ง€ ๋ชปํ•˜๋Š” ์˜ค๋™์ž‘์„ ํ•˜๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค.

๋”ฐ๋ผ์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ”๊พธ์–ด์•ผ ํ•œ๋‹ค.

.*[.]([^b].?.?|.[^a]?.?|..?[^t]?)$

ํ™•์žฅ์ž์˜ ๋ฌธ์ž ๊ฐœ์ˆ˜๊ฐ€ 2๊ฐœ์—ฌ๋„ ํ†ต๊ณผ๋˜๋Š” ์ •๊ทœ์‹์ด ๋งŒ๋“ค์–ด์กŒ๋‹ค. ํ•˜์ง€๋งŒ ์ •๊ทœ์‹์€ ์ ์  ๋” ๋ณต์žกํ•ด์ง€๊ณ  ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง„๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์—ฌ๊ธฐ์—์„œ bat ํŒŒ์ผ๋ง๊ณ  exe ํŒŒ์ผ๋„ ์ œ์™ธํ•˜๋ผ๋Š” ์กฐ๊ฑด์ด ์ถ”๊ฐ€๋กœ ์ƒ๊ธด๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ? ์ด ๋ชจ๋“  ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์ •๊ทœ์‹์„ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ํŒจํ„ด์€ ๋”์šฑ๋” ๋ณต์žกํ•ด์งˆ ๊ฒƒ์ด๋‹ค. ์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ ์šฐ๋ฆฌ๋Š” ๋ถ€์ •์  ์ „๋ฐฉ ํƒ์ƒ‰์„ ์‚ฌ์šฉํ•œ๋‹ค.

.*[.](?!bat$).*$

ํ™•์žฅ์ž๊ฐ€ bat๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ์—๋งŒ ํ†ต๊ณผ๋œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. bat ๋ฌธ์ž์—ด์ด ์žˆ๋Š”์ง€ ์กฐ์‚ฌํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ฌธ์ž์—ด์ด ์†Œ๋น„๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ bat๊ฐ€ ์•„๋‹ˆ๋ผ๊ณ  ํŒ๋‹จ๋˜๋ฉด ๊ทธ ์ดํ›„ ์ •๊ทœ์‹ ๋งค์น˜๊ฐ€ ์ง„ํ–‰๋œ๋‹ค.

exe ์—ญ์‹œ ์ œ์™ธํ•˜๋ผ๋Š” ์กฐ๊ฑด์ด ์ถ”๊ฐ€๋˜๋”๋ผ๋„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ„๋‹จํžˆ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

.*[.](?!bat$|exe$).*$

Reference