์›๋ž˜ ๊ทธ ๋ฌธ์ž๊ฐ€ ๊ฐ€์ง„ ๋œป์ด ์•„๋‹Œ ํŠน๋ณ„ํ•œ ์šฉ๋„๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ์ž

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

[ ] ์‚ฌ์ด์— ์žˆ๋Š” ๊ฐ๊ฐ์˜ ๋ฌธ์ž๋“ค์— ๋Œ€ํ•ด ์ ์–ด๋„ ํ•˜๋‚˜๊ฐ€ ๋งค์น˜๊ฐ€ ๋˜๋Š”๊ฐ€?

์ฆ‰, ์ •๊ทœ ํ‘œํ˜„์‹์ด [abc]๋ผ๋ฉด ์ด ํ‘œํ˜„์‹์˜ ์˜๋ฏธ๋Š” โ€œa, b, c ์ค‘ ํ•œ ๊ฐœ์˜ ๋ฌธ์ž์™€ ๋งค์น˜โ€๋ฅผ ๋œปํ•œ๋‹ค.

  • โ€œaโ€๋Š” ์ •๊ทœ์‹๊ณผ ์ผ์น˜ํ•˜๋Š” ๋ฌธ์ž์ธ โ€œaโ€๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ๋งค์น˜
  • โ€œbeforeโ€๋Š” ์ •๊ทœ์‹๊ณผ ์ผ์น˜ํ•˜๋Š” ๋ฌธ์ž์ธ โ€œbโ€๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ๋งค์น˜
  • โ€œdudeโ€๋Š” ์ •๊ทœ์‹๊ณผ ์ผ์น˜ํ•˜๋Š” ๋ฌธ์ž์ธ a, b, c ์ค‘ ์–ด๋Š ํ•˜๋‚˜๋„ ํฌํ•จํ•˜๊ณ  ์žˆ์ง€ ์•Š์œผ๋ฏ€๋กœ ๋งค์น˜๋˜์ง€ ์•Š์Œ

[ ] ์•ˆ์˜ ๋‘ ๋ฌธ์ž ์‚ฌ์ด์— ํ•˜์ดํ”ˆ(-)์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‘ ๋ฌธ์ž ์‚ฌ์ด์˜ ๋ฒ”์œ„(From - To)๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด [a-c]๋ผ๋Š” ์ •๊ทœ ํ‘œํ˜„์‹์€ [abc]์™€ ๋™์ผํ•˜๊ณ  [0-5]๋Š” [012345]์™€ ๋™์ผํ•˜๋‹ค.

  • [a-zA-Z] : ์•ŒํŒŒ๋ฒณ ๋ชจ๋‘
  • [0-9] : ์ˆซ์ž

๋ฌธ์ž ํด๋ž˜์Šค([ ]) ์•ˆ์—๋Š” ์–ด๋–ค ๋ฌธ์ž๋‚˜ ๋ฉ”ํƒ€ ๋ฌธ์ž๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ..

์ฃผ์˜์‚ฌํ•ญ

์ฃผ์˜ํ•ด์•ผ ํ•  ๋ฉ”ํƒ€ ๋ฌธ์ž๊ฐ€ 1๊ฐ€์ง€ ์žˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋ฐ”๋กœ ^์ธ๋ฐ, ๋ฌธ์ž ํด๋ž˜์Šค ์•ˆ์— ^ ๋ฉ”ํƒ€ ๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ์—๋Š” ๋ฐ˜๋Œ€(not)๋ผ๋Š” ์˜๋ฏธ๋ฅผ ๊ฐ–๋Š”๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด [^0-9]๋ผ๋Š” ์ •๊ทœ ํ‘œํ˜„์‹์€ ์ˆซ์ž๊ฐ€ ์•„๋‹Œ ๋ฌธ์ž๋งŒ ๋งค์น˜๋œ๋‹ค.

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

|๋ฉ”ํƒ€๋ฌธ์ž|๋™์ผ ํ‘œํ˜„์‹|์„ค๋ช…| |:โ€”:--------|:----:----------|::----| |\d|[0-9]|์ˆซ์ž์™€ ๋งค์น˜| |\D|[^0-9]|์ˆซ์ž๊ฐ€ ์•„๋‹Œ ๊ฒƒ๊ณผ ๋งค์น˜| |\s|[ \t\n\r\f\v]|whitespace ๋ฌธ์ž(์ŠคํŽ˜์ด์Šค, ๊ณต๋ฐฑ, tab)์™€ ๋งค์น˜(๋งจ ์•ž์˜ ๋นˆ ์นธ์€ ๊ณต๋ฐฑ๋ฌธ์ž(space)๋ฅผ ์˜๋ฏธํ•œ๋‹ค.)| |\S|[^ \t\n\r\f\v]|whitespace ๋ฌธ์ž๊ฐ€ ์•„๋‹Œ ๊ฒƒ๊ณผ ๋งค์น˜| |\w|[a-zA-Z0-9_]|๋ฌธ์ž+์ˆซ์ž(alphanumeric)์™€ ๋งค์น˜| |\W|[^a-za-z0-9_]|๋ฌธ์ž+์ˆซ์ž(alphanumeric)๊ฐ€ ์•„๋‹Œ๋ฌธ์ž์™€ ๋งค์น˜|

๋Œ€๋ฌธ์ž ์‚ฌ์šฉ์€ ์†Œ๋ฌธ์ž์˜ ๋ฐ˜๋Œ€์ด๋‹ค.

Dot(.)

์ค„๋ฐ”๊ฟˆ ๋ฌธ์ž์ธ \n์„ ์ œ์™ธํ•œ ๋ชจ๋“  ๋ฌธ์ž์™€ ๋งค์น˜๋จ์„ ์˜๋ฏธ, ๋‹จ ํ•˜๋‚˜๋ผ๋„ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

์‚ฌ์‹ค, re.DOTALL ์˜ต์…˜์„ ์ฃผ๋ฉด \n ๋ฌธ์ž์™€๋„ ๋งค์น˜๋œ๋‹ค. ์ผ๋‹จ ์˜ˆ์ œ๋ฅผ ๋ณด๋ฉฐ ์ดํ•ดํ•ด๋ณด์ž.

|์ •๊ทœ์‹|์˜๋ฏธ| |:-:------|::----| |a.b|โ€œa + ๋ชจ๋“ ๋ฌธ์ž + bโ€|

์ฆ‰, a์™€ b๋ผ๋Š” ๋ฌธ์ž ์‚ฌ์ด์— ์–ด๋–ค ๋ฌธ์ž๊ฐ€ ๋“ค์–ด๊ฐ€๋„ ๋ชจ๋‘ ๋งค์น˜๋œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. ๋ฌธ์ž์—ด โ€œaabโ€, โ€œa0bโ€, โ€œabcโ€๊ฐ€ ์ •๊ทœ์‹ a.b์™€ ์–ด๋–ป๊ฒŒ ๋งค์น˜๋˜๋Š”์ง€ ์‚ดํŽด๋ณด์ž.

  • โ€œaabโ€๋Š” ๊ฐ€์šด๋ฐ ๋ฌธ์ž โ€œaโ€๊ฐ€ ๋ชจ๋“  ๋ฌธ์ž๋ฅผ ์˜๋ฏธํ•˜๋Š” .๊ณผ ์ผ์น˜ํ•˜๋ฏ€๋กœ ์ •๊ทœ์‹๊ณผ ๋งค์น˜๋œ๋‹ค.
  • โ€œa0bโ€๋Š” ๊ฐ€์šด๋ฐ ๋ฌธ์ž โ€œ0โ€๊ฐ€ ๋ชจ๋“  ๋ฌธ์ž๋ฅผ ์˜๋ฏธํ•˜๋Š” .๊ณผ ์ผ์น˜ํ•˜๋ฏ€๋กœ ์ •๊ทœ์‹๊ณผ ๋งค์น˜๋œ๋‹ค.
  • โ€œabcโ€๋Š” โ€œaโ€๋ฌธ์ž์™€ โ€œbโ€๋ฌธ์ž ์‚ฌ์ด์— ์–ด๋–ค ๋ฌธ์ž๋ผ๋„ ํ•˜๋‚˜๋Š” ์žˆ์–ด์•ผ ํ•˜๋Š” ์ด ์ •๊ทœ์‹๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋งค์น˜๋˜์ง€ ์•Š๋Š”๋‹ค.

๋งˆ์ง€๋ง‰์ด ํ—ท๊ฐˆ๋ฆฐ๋‹ค. ์กฐ์‹ฌํ•˜๋„๋ก ํ•˜์ž. ๊ทธ๋Ÿฐ๋ฐ ๋งŒ์•ฝ โ€.โ€ ๋ฌธ์ž ์ž์ฒด์™€ ๋งค์นญ์ด ๋˜๊ธธ ์›ํ•œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ?

|์ •๊ทœ์‹|์˜๋ฏธ| |:-:------|::----| |a[.]b|โ€œa + Dot(.)๋ฌธ์ž + bโ€|

์ •๊ทœ์‹ a[.]b๋Š” โ€œa.bโ€ ๋ฌธ์ž์—ด๊ณผ ๋งค์น˜๋˜๊ณ , โ€œa0bโ€ ๋ฌธ์ž์—ด๊ณผ๋Š” ๋งค์น˜๋˜์ง€ ์•Š๋Š”๋‹ค. ํ˜ผ๋™ํ•˜์ง€ ๋ง์ž.

๋ฐ˜๋ณต(*)

ํŠน์ • ๋ฌธ์ž๊ฐ€ 0๋ถ€ํ„ฐ ๋ฌดํ•œ๋Œ€๊นŒ์ง€์˜ ๋ฐ˜๋ณต์„ ๋งค์นญํ•œ๋‹ค.

|์ •๊ทœ์‹|๋ฌธ์ž์—ด|Match ์—ฌ๋ถ€|์„ค๋ช…| |:-:------|:-:------|:------:----|::----| |ca*t|ct|Yes|โ€œaโ€๊ฐ€ 0๋ฒˆ ๋ฐ˜๋ณต๋˜์–ด ๋งค์น˜| |ca*t|cat|Yes|โ€œaโ€๊ฐ€ 0๋ฒˆ ์ด์ƒ ๋ฐ˜๋ณต๋˜์–ด ๋งค์น˜ (1๋ฒˆ ๋ฐ˜๋ณต)| |ca*t|caaat|Yes|โ€œaโ€๊ฐ€ 0๋ฒˆ ์ด์ƒ ๋ฐ˜๋ณต๋˜์–ด ๋งค์น˜ (3๋ฒˆ ๋ฐ˜๋ณต)|

๋ฐ˜๋ณต(+)

ํŠน์ • ๋ฌธ์ž๊ฐ€ 1๋ถ€ํ„ฐ ๋ฌดํ•œ๋Œ€๊นŒ์ง€์˜ ๋ฐ˜๋ณต์„ ๋งค์นญํ•œ๋‹ค.

|์ •๊ทœ์‹|๋ฌธ์ž์—ด|Match ์—ฌ๋ถ€|์„ค๋ช…| |:-:------|:-:------|:------:----|::----| |ca+t|ct|No|โ€œaโ€๊ฐ€ 0๋ฒˆ ๋ฐ˜๋ณต๋˜์–ด ๋งค์น˜๋˜์ง€ ์•Š์Œ| |ca+t|cat|Yes|โ€œaโ€๊ฐ€ 0๋ฒˆ ์ด์ƒ ๋ฐ˜๋ณต๋˜์–ด ๋งค์น˜ (1๋ฒˆ ๋ฐ˜๋ณต)| |ca+t|caaat|Yes|โ€œaโ€๊ฐ€ 0๋ฒˆ ์ด์ƒ ๋ฐ˜๋ณต๋˜์–ด ๋งค์น˜ (3๋ฒˆ ๋ฐ˜๋ณต)|

๋ฐ˜๋ณต({n,m})

ํŠน์ • ๋ฌธ์ž๊ฐ€ n์ด์ƒ m์ดํ•˜ ๋ฐ˜๋ณต ํšŸ์ˆ˜์ธ ๊ฒฝ์šฐ ๋งค์นญํ•œ๋‹ค.

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

{1,}์€ +์™€ ๋™์ผํ•˜๊ณ , {0,}์€ *์™€ ๋™์ผํ•˜๋‹ค. ์ด ๋ถ€๋ถ„์„ ์–ธ๊ธ‰ํ•˜๋Š” ์ด์œ ๋Š”, ๊ตณ์ด ์ €๋Ÿฐ ํ‘œํ˜„๋ณด๋‹ค๋Š” +, *์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ง๊ด€์ ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

{n}

๋ฐ˜๋“œ์‹œ n๋ฒˆ ๋ฐ˜๋ณต.

|์ •๊ทœ์‹|๋ฌธ์ž์—ด|Match ์—ฌ๋ถ€|์„ค๋ช…| |:-:------|:-:------|:------:----|::----| |ca{2}t|cat|No|โ€œaโ€๊ฐ€ 1๋ฒˆ๋งŒ ๋ฐ˜๋ณต๋˜์–ด ๋งค์น˜๋˜์ง€ ์•Š์Œ| |ca{2}t|caat|Yes|โ€œaโ€๊ฐ€ 2๋ฒˆ ๋ฐ˜๋ณต๋˜์–ด ๋งค์น˜|

{n, m}

n~m ๋ฒˆ ๋ฐ˜๋ณต.

|์ •๊ทœ์‹|๋ฌธ์ž์—ด|Match ์—ฌ๋ถ€|์„ค๋ช…| |:-:------|:-:------|:------:----|::----| |ca{2,5}t|cat|No|โ€œaโ€๊ฐ€ 1๋ฒˆ๋งŒ ๋ฐ˜๋ณต๋˜์–ด ๋งค์น˜๋˜์ง€ ์•Š์Œ| |ca{2,5}t|caat|Yes|โ€œaโ€๊ฐ€ 2๋ฒˆ ๋ฐ˜๋ณต๋˜์–ด ๋งค์น˜| |ca{2,5}t|caaaaat|Yes|โ€œaโ€๊ฐ€ 5๋ฒˆ ๋ฐ˜๋ณต๋˜์–ด ๋งค์น˜|

?

์žˆ์–ด๋„ ๋˜๊ณ  ์—†์–ด๋„ ๋œ๋‹ค.

|์ •๊ทœ์‹|๋ฌธ์ž์—ด|Match ์—ฌ๋ถ€|์„ค๋ช…| |:-:------|:-:------|:------:----|::----| |ab?c|abc|Yes|โ€œbโ€๊ฐ€ 1๋ฒˆ ์‚ฌ์šฉ๋˜์–ด ๋งค์น˜| |ab?c|ac|Yes|โ€œbโ€๊ฐ€ 0๋ฒˆ ์‚ฌ์šฉ๋˜์–ด ๋งค์น˜|

๋ฌธ์ž์—ด ์†Œ๋น„

์ •๊ทœ์‹์„ ๊ณต๋ถ€ํ•˜๋‹ค ๋ณด๋ฉด Assertion ์ด๋ผ๋Š” ๋‹จ์–ด๋ฅผ ์ž์ฃผ ๋ณด๊ฒŒ๋œ๋‹ค. Assertion์ด๋ผ๋Š” ๋‹จ์–ด๋Š” ๊ฒ€์‚ฌ, ๊ฒ€์ฆ, ํ™•์ธ ์ด๋ผ๋Š” ์˜๋ฏธ๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์–ด๋–ค ๊ฒƒ์„ ๊ฒ€์‚ฌํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ๋กœ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ Zero-width๋Š” ๋ฌด์—‡์ธ๊ฐ€? ๋„ˆ๋น„๊ฐ€ ์—†๋‹ค๋Š” ์˜๋ฏธ์ธ๋ฐ ์™œ ์ด๋Ÿฐ ์ถ”์ƒ์ ์ธ ๋‹จ์–ด๋ฅผ ์ผ๋Š”์ง€๋Š” ์•„์ง๋„ ๋ชจ๋ฅด๊ฒ ๋‹ค. ํ•˜์ง€๋งŒ ๋ง์„ ๋ผ์›Œ ๋งž์ถฐ์„œ ์—ฐ์ƒ์„ ์‰ฝ๊ฒŒ ํ•ด๋ณด๋„๋ก ํ•˜์ž.

์ด ๊ฐœ๋…์„ ์•Œ๊ธฐ ์ „์— ์šฐ๋ฆฌ๊ฐ€ ์•Œ์•„์•ผ ํ•  ๊ฒƒ์ด ์žˆ๋‹ค. ์ง€๊ธˆ ์ด ๊ธ€์„ ์•ž์˜ ๋ฉ”ํƒ€ ๋ฌธ์ž์™€ ๋”ฐ๋กœ ์“ด ์ด์œ ๊ฐ€ ์—ฌ๊ธฐ์— ์žˆ๋‹ค. ์•ž์—์„œ ๋ฐฐ์šด ๋ฉ”ํƒ€๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์šฐ๋ฆฌ๋Š” ๋ฌธ์ž์—ด์„ ์†Œ๋น„ํ•œ๋‹ค. ์ด๊ฒŒ ๋ฌด์Šจ ์†Œ๋ฆฌ์ผ๊นŒ.

์ด ๊ต‰์žฅํžˆ ์ถ”์ƒ์ ์ธ ๊ฐœ๋…์€ ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด ํ•œ๋ฒˆ๋งŒ ์ƒ๊ฐํ•˜๋ฉด ๊ต‰์žฅํžˆ ์‰ฝ๊ฒŒ ์ดํ•ด๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์•„๋ฒ„์ง€๊ฐ€๋ฐฉ์—๋“ค์–ด๊ฐ„๋‹ค ๋ผ๋Š” ๋ฌธ์ž์—ด์ด ์žˆ๋‹ค๊ณ  ํ•ด๋ณด์ž. ๋‚ด๊ฐ€ ๊ถ๊ธˆํ•œ ์ •๋ณด๋Š” ๊ฐ€๋ฐฉ์„ ์ฐพ๊ณ  ๋ฐฉ์— ๋ฅผ ์ฐพ๊ณ  ์‹ถ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•ด [๊ฐ€๋ฐฉ] ์ด๋ ‡๊ฒŒ ์ •๊ทœ์‹์„ ์ž‘์„ฑํ•˜๊ณ  ๊ฒ€์ƒ‰์„ ์ง„ํ–‰ํ–ˆ์„ ๋•Œ, ์ •๊ทœ์‹ ์—”์ง„์ด ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๊ตฌ๋™ํ•˜๋Š”์ง€๋ฅผ ๋”ฐ๋ผ๊ฐ€ ๋ณด์ž.

  1. ์•„๋ฒ„์ง€ ๋ถ€๋ถ„ ๊นŒ์ง€๋Š” ๋งค์น˜๊ฐ€ ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๊ทธ๋ƒฅ ์ง€๋‚˜๊ฐ„๋‹ค.
  2. ๊ฐ€๋ฐฉ์„ ํ™•์ธํ•˜๊ณ ๋Š” ๋งค์น˜๋˜์—ˆ์œผ๋ฏ€๋กœ ๋ฌธ์ž์—ด์„ ์†Œ๋น„ํ•ด ๋ฒ„๋ฆฐ๋‹ค. ์ฆ‰ ์—†์•  ๋ฒ„๋ฆฐ๋‹ค์™€ ๊ฐ™์€ ๊ฐœ๋…์œผ๋กœ ๋ณด๋Š” ๊ฒƒ์ด๋‹ค.
  3. ์†Œ๋น„๋œ ๋ฌธ์ž์—ด์€ ์ณ๋‹ค๋„ ์•ˆ๋ณด๊ณ  ๊ทธ ๋‹ค์Œ ๋ฌธ์ž์—ด์ธ ์—๋“ค์–ด๊ฐ„๋‹ค ๋ผ๋Š” ๋ฌธ์ž์—ด์— ๋Œ€ํ•ด ๊ฐ€๋ฐฉ ๋ฌธ์ž์—ด์„ ์ฐพ๋Š”๋‹ค.
  4. ๊ฐ€๋ฐฉ์„ ์ฐพ๋Š” ์ •๊ทœํ‘œํ˜„์‹์€ ๋๋‚œ๋‹ค.
  5. ๋ฐฉ์—๋ฅผ ์ฐพ๋Š” ์ •๊ทœํ‘œํ˜„์‹์ด ์‹œ์ž‘๋˜๊ณ , ์ฐพ์ง€ ๋ชปํ•œ ์ƒํƒœ๋กœ ๋๋‚œ๋‹ค.

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

Zero-width Assertion

๊ทธ๋ ‡๋‹ค๋ฉด, ๋„ˆ๋น„๊ฐ€ ์—†๋Š” ํ™•์ธ ์ด๋ผ๋Š” ์˜๋ฏธ์˜ Zero-width Assertion์€ ๋ฌด์—‡์ผ๊นŒ. ์œ„์—์„œ ๊ฐ€๋ฐฉ์ด๋ผ๋Š” ๋‹จ์–ด๋Š” 2์˜ ๋„ˆ๋น„๋ฅผ ๊ฐ€์ง„๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋งค์นญ์ด ๋˜์—ˆ์„ ๋•Œ, ์ด 2์˜ ๋„ˆ๋น„์— ํ•ด๋‹นํ•˜๋Š” ๋ฌธ์ž์—ด์ด ์†Œ๋น„๋œ๋‹ค. ์ด๋Ÿฌํ•œ ๊ด€์ ์—์„œ ๋ณด์•˜์„ ๋•Œ, 0์˜ ๋„ˆ๋น„๋ฅผ ๊ฐ€์ง„๋‹ค๊ณ  ํ•จ์€, ๊ฒ€์ฆ์„ ์ง„ํ–‰ํ•˜๋Š”๋ฐ ์žˆ์–ด ์†Œ๋น„๊ฐ€ ๋˜๋Š” ๋ฌธ์ž์—ด์ด ์—†๋‹ค๋ผ๋Š” ์˜๋ฏธ๋กœ ์™€๋‹ฟ๋Š”๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ด๋Ÿฌํ•œ ํ•ด์„์ด ๋งž์œผ๋ฉฐ, Zero-width Assertion๋Š” ๊ฒ€์ƒ‰์„ ์ง„ํ–‰ํ•˜๋Š”๋ฐ ์žˆ์–ด ์œ„์—์„œ ์•Œ์•„๋ณธ ๋ฌธ์ž์—ด ์†Œ๋น„๊ฐ€ ์—†๋Š” ๋ฐฉ๋ฒ•์„ ๋งํ•œ๋‹ค. ์ด์ œ ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ๋ฉ”ํƒ€ ๋ฌธ์ž์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž.

^ ๋˜๋Š” ๋กœ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

|๋ฉ”ํƒ€๋ฌธ์ž|์„ค๋ช…| |:โ€”:--------|::----| ||| |^|๋ฌธ์ž์—ด์˜ ๋งจ ์ฒ˜์Œ๊ณผ ์ผ์น˜ํ•˜๋Š”๊ฐ€?(์˜ต์…˜์— ๋”ฐ๋ผ ์˜๋ฏธ๊ฐ€ ๋‹ค๋ฆ„)| |$|๋ฌธ์ž์—ด์˜ ๋งจ ๋๊ณผ ์ผ์น˜ํ•˜๋Š”๊ฐ€?(์˜ต์…˜์— ๋”ฐ๋ผ ์˜๋ฏธ๊ฐ€ ๋‹ค๋ฆ„)| |\A|๋ฌธ์ž์—ด์˜ ๋งจ ์ฒ˜์Œ๊ณผ ์ผ์น˜ํ•˜๋Š”๊ฐ€?(์˜ต์…˜์— ๋”ฐ๋ผ ์˜๋ฏธ๊ฐ€ ๋‹ค๋ฆ„)| |\Z|๋ฌธ์ž์—ด์˜ ๋งจ ๋๊ณผ ์ผ์น˜ํ•˜๋Š”๊ฐ€?(์˜ต์…˜์— ๋”ฐ๋ผ ์˜๋ฏธ๊ฐ€ ๋‹ค๋ฆ„)| |\b|๋‹จ์–ด ๊ตฌ๋ถ„์ž(whitespace)| |\B|whitespace๊ฐ€ ์–‘์ชฝ์— ์—†๋Š”(์‚ฌ์‹ค ๋‹จ์–ด๋ผ๊ณ  ๋ณผ์ˆ˜๋Š” ์—†๋‹ค) ๊ฒฝ์šฐ์— ํ•ด๋‹น ๋ฌธ์ž๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋งค์น˜|

|

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

>>> p = re.compile('Crow|Servo')
>>> m = p.match('CrowHello')
>>> print(m)
<re.Match object; span=(0, 4), match='Crow'>

^

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

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

>>> print(re.search('^Life', 'Life is too short'))
<re.Match object; span=(0, 4), match='Life'>
>>> print(re.search('^Life', 'My Life'))
None

^Life ์ •๊ทœ์‹์€ Life ๋ฌธ์ž์—ด์ด ์ฒ˜์Œ์— ์˜จ ๊ฒฝ์šฐ์—๋Š” ๋งค์น˜ํ•˜์ง€๋งŒ ์ฒ˜์Œ ์œ„์น˜๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ์—๋Š” ๋งค์น˜๋˜์ง€ ์•Š์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

$

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

>>> print(re.search('short$', 'Life is too short'))
<re.Match object; span=(12, 17), match='short'>
>>> print(re.search('short$', 'Life is too short, you need python'))
None

short$ ์ •๊ทœ์‹์€ ๊ฒ€์ƒ‰ํ•  ๋ฌธ์ž์—ด์ด 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๋กœ ๊ตฌ๋ถ„๋œ ๋‹จ์–ด๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ๋งค์น˜๋˜์ง€ ์•Š๋Š”๋‹ค.

>>> print(p.search('one subclass is'))
None

subclass ๋ฌธ์ž์—ด ์—ญ์‹œ class ์•ž์— sub ๋ฌธ์ž์—ด์ด ๋”ํ•ด์ ธ ์žˆ์œผ๋ฏ€๋กœ ๋งค์น˜๋˜์ง€ ์•Š์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

\b ๋ฉ”ํƒ€ ๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ์ด ์žˆ๋‹ค. \b๋Š” ํŒŒ์ด์ฌ ๋ฆฌํ„ฐ๋Ÿด ๊ทœ์น™์— ์˜ํ•˜๋ฉด ๋ฐฑ์ŠคํŽ˜์ด์Šค(BackSpace)๋ฅผ ์˜๋ฏธํ•˜๋ฏ€๋กœ ๋ฐฑ์ŠคํŽ˜์ด์Šค๊ฐ€ ์•„๋‹Œ ๋‹จ์–ด ๊ตฌ๋ถ„์ž์ž„์„ ์•Œ๋ ค ์ฃผ๊ธฐ ์œ„ํ•ด r'\bclass\b'์ฒ˜๋Ÿผ Raw string์ž„์„ ์•Œ๋ ค์ฃผ๋Š” ๊ธฐํ˜ธ r์„ ๋ฐ˜๋“œ์‹œ ๋ถ™์—ฌ ์ฃผ์–ด์•ผ ํ•œ๋‹ค.

\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'>
>>> print(p.search('one subclass is'))
None

class ๋‹จ์–ด์˜ ์•ž๋’ค์— whitespace๊ฐ€ ํ•˜๋‚˜๋ผ๋„ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ๋งค์น˜๊ฐ€ ์•ˆ ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

Reference