Á¤±Ô Ç¥Çö½Ä HOWTO

ÄíŬ¸µ(A.M. Kuchling)

ÇѱÛÆÇ johnsonj 2003.11.25

¿ä¾à:

ÀÌ ¹®¼­´Â ÆÄÀ̽㿡¼­ re ¸ðµâÀ» °¡Áö°í Á¤±Ô Ç¥Çö½ÄÀ» »ç¿ëÇÏ´Â ¹ý¿¡ ´ëÇÑ °³·Ð Æ©Å丮¾óÀÌ´Ù. ¶óÀ̺귯¸® ÂüÁ¶¼­º¸´Ù Á» ´õ ºÎµå·´°Ô ¼Ò°³ÇÑ´Ù.

ÀÌ ¹®¼­´Â http://www.amk.ca/python/howto¿¡¼­ ¾òÀ» ¼ö ÀÖ´Ù.



³»¿ë

1 µé¾î°¡´Â ¸»

re ¸ðµâÀÌ ÆÄÀ̽ã 1.5¿¡ Ãß°¡µÇ¾î, ÆÞ-½ºÅ¸ÀÏÀÇ Á¤±Ô Ç¥Çö½Ä ÆÐÅÏÀ» Á¦°øÇÑ´Ù. ÀÌÀü ¹öÀüÀÇ ÆÄÀ̽㿡¼­´Â regex ¸ðµâÀÌ µû¶ó¿Ô´Âµ¥, ÀÌ´Â À̸ƽº-½ºÅ¸ÀÏÀÇ ÆÐÅÏÀ» Á¦°øÇÑ´Ù. À̸ƽº-½ºÅ¸ÀÏÀÇ ÆÐÅÏÀº ¾à°£ ÀбⰡ ´õ ¾î·Æ°í ±×·¸°Ô ¸¹Àº Ư¡À» Á¦°øÇÏÁö ¾ÊÀ¸¹Ç·Î, »õ·Î¿î Äڵ带 ÀÛ¼ºÇÒ ¶§ regex ¸ðµâÀ» »ç¿ëÇØ¾ß ÇÒ ÀÌÀ¯°¡ º°·Î ¾ø´Ù. ºñ·Ï ¿¹Àü Äڵ忡¼­´Â »ç¿ëÇÏ´Â °ÍÀ» ¸¶ÁÖÇÒ ¼öµµ ÀÖ°ÚÁö¸¸ ¸»ÀÌ´Ù.

Á¤±Ô Ç¥Çö½Ä(RE)Àº º»ÁúÀûÀ¸·Î, ÀÛ°í °íµµ·Î Àü¹®È­µÈ ÇÁ·Î±×·¡¹Ö ¾ð¾î·Î¼­ ÆÄÀ̽㿡 ÀÓº£µå µÇ¾î¼­ re ¸ðµâÀ» ÅëÇÏ¿© »ç¿ëÇÒ ¼ö ÀÖ´Ù. ÀÌ ÀÛÀº ¾ð¾î¸¦ »ç¿ëÇϸé, ÀÏÄ¡½ÃÅ°°í ½ÍÀº ¹®ÀÚ¿­ ÁýÇÕ¿¡ ´ëÇÏ¿© ±ÔÄ¢À» ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù; ÀÌ ÁýÇÕ¿¡´Â ¿µ¾î ¹®ÀåÀ̳ª, ÀüÀÚ¿ìÆí ÁÖ¼Ò, ¶Ç´Â TeX ¸í·É¾î, ¿øÇÏ´Â ¹«¾ùÀ̵ç Æ÷ÇԵȴÙ. ±×·¯¸é ÀÌ·¸°Ô Áú¹®ÇÒ ¼ö ÀÖ´Ù ``ÀÌ ¹®ÀÚ¿­ÀÌ ÆÐÅÏ¿¡ ÀÏÄ¡Çϴ°¡?'', ¶Ç´Â ``ÀÌ ¹®ÀÚ¿­¿¡¼­ ÆÐÅÏ¿¡ ÀÏÄ¡ÇÏ´Â °ÍÀÌ Àִ°¡?''. RE¸¦ »ç¿ëÇÏ¸é ¶ÇÇÑ ¹®ÀÚ¿­À» º¯°æÇϰųª ¿©·¯°¡Áö ¹æ½ÄÀ¸·Î °¡¸¦ ¼ö ÀÖ´Ù.

Á¤±Ô Ç¥Çö½Ä ÆÐÅÏÀº ÀÏ·ÃÀÇ ¹ÙÀÌÆ®ÄÚµå·Î ÄÄÆÄÀϵǰí C·Î ÀÛ¼ºµÈ ÀÏÄ¡ ¿£Áø¿¡ ÀÇÇؼ­ ½ÇÇàµÈ´Ù. ¼öÁسô°Ô »ç¿ëÇÏ·Á¸é, ÀÌ ¿£ÁøÀÌ ¾î¶»°Ô ÁÖ¾îÁø RE¸¦ ½ÇÇàÇÏ´ÂÁö ÁÖÀǸ¦ ±â¿ï¿©¼­, ´õ »¡¸® ½ÇÇàµÇ´Â ¹ÙÀÌÆ®Äڵ带 »ý»êÇϵµ·Ï RE¸¦ ÀÛ¼ºÇÒ ÇÊ¿ä°¡ ÀÖ´Ù. ÃÖÀûÈ­´Â ÀÌ ÀÏÄ¡ ¿£ÁøÀÇ ³»ºÎ¿¡ ´ëÇؼ­ Àß ¾Ë°í ÀÖ¾î¾ß ÇÒ ÇÊ¿ä°¡ Àֱ⠶§¹®¿¡ ÀÌ ¹®¼­¿¡¼­ ´Ù·çÁö ¾Ê´Â´Ù.

Á¤±Ô Ç¥Çö½Ä ¾ð¾î´Â »ó´ëÀûÀ¸·Î ÀÛ°í Á¦ÇÑÀûÀÌ´Ù. ±×·¡¼­ Á¤±Ô Ç¥Çö½ÄÀ» »ç¿ëÇÑ´Ù°í ÇÏ´õ¶óµµ ¸ðµç ¹®ÀÚ¿­ ÀÛ¾÷ÀÌ °¡´ÉÇÑ °ÍÀº ¾Æ´Ï´Ù. ¶Ç Á¤±Ô Ç¥Çö½ÄÀ¸·Î 󸮰¡ °¡´ÉÇÏÁö¸¸, ±× Ç¥Çö½ÄÀÌ ³Ê¹«³ªµµ º¹ÀâÇÑ ÀÛ¾÷µµ ÀÖ´Ù. ÀÌ·± °æ¿ì, ÆÄÀ̽ã Äڵ带 ÀÛ¼ºÇؼ­ 󸮸¦ ÇÏ´Â °ÍÀÌ ´õ ÁÁ´Ù; Á¤±³ÇÑ Á¤±Ô Ç¥Çö½Äº¸´Ù ÆÄÀ̽ã Äڵ尡 ´À¸®°ÚÁö¸¸, ¾Æ¸¶µµ ´õ ÀÌÇØ°¡ ½¬¿ï °ÍÀÌ´Ù.

2 °£´ÜÇÑ ÆÐÅÏ

¸ÕÀú °¡Àå °£´ÜÇÑ Á¤±Ô Ç¥Çö½ÄÀ» ¹è¿öº¸ÀÚ. Á¤±Ô Ç¥Çö½ÄÀº ¹®ÀÚ¿­ 󸮿¡ »ç¿ëµÇ±â ¶§¹®¿¡, °¡Àå ÀϹÝÀûÀÎ ÀÛ¾÷ºÎÅÍ ½ÃÀÛÇÏÀÚ: ¹®ÀÚ¿­À» ÀÏÄ¡½ÃÄÑ º¸ÀÚ.

Á¤±Ô Ç¥Çö½Ä ¾Æ·¡¿¡ ¼û°ÜÁø ´õ ÀÚ¼¼ÇÑ ÄÄÇ»ÅÍ °øÇÐÀû ¼³¸íÀÌ (°áÁ¤ ±×¸®°í ºñ-°áÁ¤ À¯ÇÑ ¿ÀÅ丶Ÿ) ÇÊ¿äÇϸé, ÄÄÆÄÀÏ·¯ÀÇ ÀÛ¼º¿¡ °üÇÑ ±³°ú¼­¸¦ ¾Æ¹«°Å³ª Çϳª ÂüÁ¶ÇÏÀÚ.

2.1 ¹®ÀÚ ÀÏÄ¡½ÃÅ°±â

´ëºÎºÐÀÇ ¹®ÀÚ¿Í ±âÈ£´Â ±×³É ÀÚ½ÅÀ» ÀÏÄ¡½ÃŲ´Ù. ¿¹¸¦ µé¾î, Á¤±Ô Ç¥Çö½Ä test´Â ¹®ÀÚ¿­ "test"¿¡ Á¤È®ÇÏ°Ô ÀÏÄ¡ÇÑ´Ù. (´ë¼Ò¹®ÀÚ-±¸ºÐ ¸ðµå¸¦ È°¼ºÈ­Çϸé ÀÌ RE¸¦ "Test"³ª "TEST"¿¡µµ ÀÏÄ¡½Ãų ¼ö ÀÖ´Ù; ÀÌ¿¡ °üÇؼ­´Â ³ªÁß¿¡ ´õ ÀÚ¼¼È÷ ´Ù·é´Ù.)

ÀÌ ±ÔÄ¢¿¡´Â ¿¹¿Ü°¡ ¸î°¡Áö ÀÖ´Ù; ¾î¶² ¹®ÀÚµéÀº Ưº°Çؼ­, ÀڽŰú ÀÏÄ¡ÇÏÁö ¾Ê´Â´Ù. ´ë½Å¿¡, ±×·± ¹®ÀÚµéÀº ¹«¾ð°¡ Á¤»óÀ» ¹þ¾î³­ ¾î¶² °ÍµéÀÌ ÀÏÄ¡ÇØ¾ß ÇÑ´Ù´Â °ÍÀ» ³ªÅ¸³»°Å³ª, ¶Ç´Â ¹Ýº¹ÇÔÀ¸·Î½á REÀÇ ´Ù¸¥ ºÎºÐ¿¡ ¿µÇâÀ» ¹ÌÄ£´Ù. ÀÌ ¹®¼­ÀÇ ´ëºÎºÐÀº ´Ù¾çÇÑ ¸ÞŸ¹®ÀÚµé°ú ±× ¹®ÀÚµéÀÌ ÇÏ´Â ¿ªÇÒÀ» ³íÀÇÇÑ´Ù.

´ÙÀ½Àº ¸ÞŸ¹®ÀÚÀÇ ¿Ïº®ÇÑ ¸ñ·ÏÀÌ´Ù; ±× Àǹ̸¦ Áö±ÝºÎÅÍ ´Ù·ç¾î º¸°Ú´Ù.

. ^ $ * + ? { [ ] \ | ( )

»ìÆì º¼ ù ¹ø° ¸ÞŸ¹®ÀÚ´Â "[" ±×¸®°í "]"ÀÌ´Ù. ÀÌ ¸ÞŸ¹®ÀÚ´Â ¹®ÀÚ ºÎ·ù¸¦ ÁöÁ¤Çϴµ¥ »ç¿ëµÇ´Âµ¥, ¹®ÀÚ ºÎ·ù¶õ ÀÏÄ¡½ÃÅ°°í ½ÍÀº ¹®ÀÚ ÁýÇÕÀÌ´Ù. ¹®ÀÚµéÀº µû·Îµû·Î ³ª¿­µÉ ¼ö ÀÖ´Ù. ¶Ç´Â ÀÏÁ¤ ¹üÀ§ÀÇ ¹®ÀÚµéÀ» ³ªÅ¸³»·Á¸é ¹®ÀÚ µÎ °³¸¦ ÁÖ°í ±× »çÀ̸¦ "-"·Î °¡¸£¸é µÈ´Ù. ¿¹¸¦ µé¸é, [abc]´Â ´ÙÀ½ "a", "b", ¶Ç´Â "c" ¾î´À ¹®Àڿ͵µ ÀÏÄ¡ÇÑ´Ù; ÀÌ´Â [a-c]°ú µ¿ÀÏÇϸç, ¹üÀ§¸¦ »ç¿ëÇؼ­ °°Àº ¹®ÀÚ ÁýÇÕÀ» Ç¥ÇöÇÑ´Ù. ¿ÀÁ÷ ¼Ò¹®Àڿ͸¸ ÀÏÄ¡½ÃÅ°°í ½ÍÀ¸¸é, RE´Â [a-z]¿Í °°ÀÌ µÈ´Ù.

¸ÞŸ¹®ÀÚ´Â ºÎ·ù¾È¿¡¼­´Â ÀÛ¿ëÇÏÁö ¾Ê´Â´Ù. ¿¹¸¦ µé¾î, [akm$]´Â "a", "k", "m", ¶Ç´Â "$"ÀÇ ¾î´À ¹®Àڿ͵µ ÀÏÄ¡ÇÑ´Ù; ÀϹÝÀûÀ¸·Î "$"´Â ¸ÞŸ¹®ÀÚÀÌÁö¸¸, ¹®ÀÚ ºÎ·ù ¾È¿¡¼­´Â ±× Ưº°ÇÑ º»¼ºÀ» ÀҴ´Ù.

¿©ÁýÇÕÀ» ÁöÁ¤Çؼ­ ¹üÀ§ ¾È¿¡ ¾ø´Â ¹®ÀÚ¿¡µµ ÀÏÄ¡½Ãų ¼ö ÀÖ´Ù. ÀÌ´Â ºÎ·ù¿¡¼­ ù ¹®ÀÚ·Î "^"¸¦ Æ÷ÇÔÇÏ¿© ³ªÅ¸³½´Ù; ´Ù¸¥ À§Ä¡¿¡¼­ "^"°¡ ³ªÅ¸³ª¸é ±×³É "^" ¹®ÀÚ¿¡ ÀÏÄ¡µÈ´Ù. ¿¹¸¦ µé¾î, [^5]´Â "5"¸¦ Á¦¿ÜÇÏ°í ¾î¶² ¹®ÀÚ¿¡µµ ÀÏÄ¡ÇÑ´Ù.

¾Æ¸¶µµ °¡Àå Áß¿äÇÑ ¸ÞŸ¹®ÀÚ´Â ¿ª»ç¼± "\"ÀÏ °ÍÀÌ´Ù. ÆÄÀ̽㠱âÈ£¹®ÀÚ¿¡¼­ ¿ª»ç¼± µÚ¿¡ ´Ù¾çÇÑ ¹®ÀÚµéÀÌ µû¸£¸é¼­ ´Ù¾çÇÑ Æ¯¼ö ¿¬¼Ó¿­À» ³ªÅ¸³¾ ¼ö ÀÖ´Ù. ¶Ç´Â ¸ðµç ¸ÞŸ¹®ÀÚµéÀ» ÇǽýÃÅ°´Âµ¥¿¡µµ »ç¿ëµÇ¹Ç·Î ¿©ÀüÈ÷ ÆÐÅÏÀ¸·Î ÀÏÄ¡½Ãų ¼ö ÀÖ´Ù; ¿¹¸¦ µé¾î, "[" ¶Ç´Â "\"¸¦ ÀÏÄ¡½ÃÅ°°í ½ÍÀ¸¸é, ¾Õ¿¡ ¿ª»ç¼±À» ¸ÕÀú µÎ¾î¼­ ±×ÀÇ Æ¯º°ÇÑ Àǹ̸¦ ¾ø¾Ù ¼ö ÀÖ´Ù: \[ ¶Ç´Â \\.

Ư¼ö ¿¬¼Ó¿­Áß¿¡ "\"·Î ½ÃÀÛÇÏ´Â ¿¬¼Ó¿­Àº ÀÚÁÖ ¾µ¸ð°¡ ÀÖ´Â ¹®ÀÚµéÀÌ ¹Ì¸®Á¤ÀÇµÈ ÁýÇÕÀ» ³ªÅ¸³»´Âµ¥, ¼ýÀÚ¹®ÀÚ, ±âÈ£ ÁýÇÕ, ¶Ç´Â °ø¹éÀÌ ¾Æ´Ñ ¾î¶² °ÍÀ̵çÁö µÈ´Ù. ´ÙÀ½°ú °°ÀÌ ¹Ì¸® Á¤ÀÇµÈ Æ¯¼ö ¿¬¼Ó¿­À» »ç¿ëÇÒ ¼ö ÀÖ´Ù:

\d
10Áø ¼ýÀÚ¿Í ÀÏÄ¡ÇÑ´Ù; ´ÙÀ½ ºÎ·ù¿Í µ¿ÀÏ [0-9].

\D
ºñ-¼ýÀÚ ¹®ÀÚ¿Í ÀÏÄ¡ÇÑ´Ù; ´ÙÀ½ ºÎ·ù¿Í µ¿ÀÏ [^0-9].

\s
°ø¹é ¹®ÀÚ¿Í ÀÏÄ¡ÇÑ´Ù; ´ÙÀ½ ºÎ·ù¿Í µ¿ÀÏ [ \t\n\r\f\v].

\S
ºñ-°ø¹é ¹®ÀÚ¿Í ÀÏÄ¡ÇÑ´Ù; ´ÙÀ½ ºÎ·ù¿Í µ¿ÀÏ [^ \t\n\r\f\v].

\w
¿µ¹®ÀÚ¼ýÀÚ¿Í ÀÏÄ¡ÇÑ´Ù; ´ÙÀ½ ºÎ·ù¿Í µ¿ÀÏ [a-zA-Z0-9_].

\W
ºñ-¿µ¹®ÀÚ¼ýÀÚ¿Í ÀÏÄ¡ÇÑ´Ù; ´ÙÀ½ ºÎ·ù¿Í µ¿ÀÏ [^a-zA-Z0-9_].

ÀÌ·± ¿¬¼Ó¿­Àº ¹®ÀÚ ºÎ·ù¾È¿¡ Æ÷Ç﵃ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î, [\s,.]´Â ¾î¶² °ø¹é ¹®ÀÚ¿¡µµ ÀÏÄ¡ÇÏ°í, ¶Ç´Â ","³ª "."¿¡µµ ÀÏÄ¡ÇÏ´Â ¹®ÀÚ ºÎ·ùÀÌ´Ù.

ÀÌ ¼½¼Ç¿¡¼­ ¸¶Áö¸·À¸·Î ´Ù·ê ¸ÞŸ¹®ÀÚ´Â .ÀÌ´Ù. »õÁÙ¹®ÀÚ »©°í´Â ¾î¶² ¹®Àڿ͵µ ÀÏÄ¡ÇÑ´Ù. ±×¸®°í ´ë¾È ¸ðµå(re.DOTALL)°¡ À־ »õÁÙ¹®ÀÚÁ¶Â÷µµ ÀÏÄ¡½Ãų ¼ö ÀÖ´Ù. "."´Â ``¾î¶² ¹®ÀÚ''¶óµµ ÀÏÄ¡½ÃÅ°°í ½ÍÀ» ¶§ ÀÚÁÖ »ç¿ëµÈ´Ù.

2.2 ¹Ýº¹ÀûÀÎ ÀÛ¾÷

´Ù¾çÇÑ ¹®ÀÚ ÁýÇÕ¿¡ ÀÏÄ¡½ÃÅ°´Â ´É·ÂÀº Á¤±Ô Ç¥Çö½ÄÀÌ ÇÒ ¼ö Àִ ù ¹ø° ´É·ÂÀ¸·Î ÀÌ´Â ¹®ÀÚ¿­¿¡ ¸Þ½îµå¿¡¼­´Â ¾ÆÁ÷ °¡´ÉÇÏÁö ¾ÊÀº ´É·ÂÀÌ´Ù. ±×·¸Áö¸¸, ±× Á¤µµ°¡ regexesÀÇ ´É·Â¿¡ Ãß°¡µÈ ÀüºÎ¶ó¸é, º°·Î Å©°Ô Áøº¸µÈ °ÍÀÌ ¾Æ´Ò °ÍÀÌ´Ù. ¶Ç´Ù¸¥ ´É·ÂÀº REÀÇ ÀϺθ¦ ¸î ¹øÀÌ¶óµµ ¹Ýº¹Çϵµ·Ï ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù.

ÀÏÀ» ¹Ýº¹Çϴµ¥ »ç¿ëµÇ´Â ù ¹ø° ¸Å°³º¯¼ö´Â *ÀÌ´Ù. *´Â ±âÈ£ ¹®ÀÚ"*"¿¡ ÀÏÄ¡µÇÁö ¾Ê´Â´Ù; ´ë½Å¿¡, ÀÌÀüÀÇ ¹®ÀÚ°¡ Á¤È®ÇÏ°Ô Çѹø ¸»°í 0ȸ ÀÌ»ó ÀÏÄ¡µÉ ¼ö ÀÖµµ·Ï ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù.

¿¹¸¦ µé¾î, ca*t´Â "ct" (0°³ÀÇ "a" ¹®ÀÚ), "cat" (1°³ÀÇ "a" ¹®ÀÚ), "caaat" (3°³ÀÇ "a" ¹®ÀÚ), µîµî¿¡ ÀÏÄ¡ÇÑ´Ù. RE ¿£ÁøÀº CÀÇ int À¯Çü¿¡¼­ ±â¿øÇÏ´Â ´Ù¾çÇÑ ³»ºÎ Á¦ÇÑÀÌ ÀÖ´Ù. ÀÌ Á¦ÇÑ ¶§¹®¿¡ 20¾ï°³°¡ ³Ñ´Â "a" ¹®ÀÚ¿¡´Â ÀÏÄ¡ÇÏÁö ¾Ê´Â´Ù; ±× Á¤µµ·Î Å« ¹®ÀÚ¿­À» ±¸¼ºÇÏ·Á¸é ¸Þ¸ð¸®°¡ ÃæºÐÇÏÁö ¾ÊÀ» °ÍÀ̹ǷÎ, ±× ÇÑ°è¿¡ ºÀÂøÇؼ­´Â ¾ÈµÈ´Ù.

*¿Í °°Àº ¹Ýº¹Àº Ž¿åÀû(greedy)À̶ó°í ÇÑ´Ù; RE¸¦ ¹Ýº¹ÇÒ ¶§, ÀÏÄ¡ ¿£ÁøÀº °¡´ÉÇÏ¸é ¸¹ÀÌ ÀÏÄ¡½ÃÅ°·Á°í ½ÃµµÇÒ °ÍÀÌ´Ù. ÆÐÅÏÀÇ ³ªÁß ºÎºÐÀÌ ÀÏÄ¡ÇÏÁö ¾ÊÀ¸¸é, ÀÏÄ¡ ¿£ÁøÀº ´Ù½Ã µ¹¾Æ¿Í ¸î ¹øÀÇ ¹Ýº¹À» ´Ù½Ã ½ÃµµÇÑ´Ù.

´Ü°èº° ¿¹Á¦·Î ÀÌ Á¡À» º¸´Ù ¸íÈ®ÇÏ°Ô ¹àÇô º¸°Ú´Ù. a[bcd]*b¶ó´Â Ç¥Çö½ÄÀ» »ý°¢ÇØ º¸ÀÚ. ÀÌ´Â ±âÈ£ "a"¿Í, ºÎ·ù [bcd]¿¡¼­ÀÇ 0ȸ ÀÌ»óÀÇ ±âÈ£¿Í ÀÏÄ¡ÇÏ°í, ±×¸®°í ¸¶Áö¸·À¸·Î "b"·Î ³¡³­´Ù. ÀÌÁ¦ ÀÌ RE¸¦ ¹®ÀÚ¿­ "abcbd"¿¡ ÀÏÄ¡½ÃÄÑ º»´Ù°í »ý°¢ÇØ º¸ÀÚ.

´Ü°è  ÀÏÄ¡µÊ  Çؼ³ 
1 a RE¿¡¼­ a°¡ ÀÏÄ¡ÇÑ´Ù.
2 abcbd ¿£ÁøÀº [bcd]*¿¡ ÀÏÄ¡ÇÏ°í, ÃÖ´ëÇÑ ¸Ö¸® °¡¼­, ¹®ÀÚ¿­ÀÇ ³¡¿¡ À̸¥´Ù.
3 Failure ¿£ÁøÀº b¿¡ ÀÏÄ¡ÇÏ·Á°í ½ÃµµÇÏÁö¸¸, ÇöÀç À§Ä¡°¡ ¹®ÀÚ¿­ÀÇ ³¡À̹ǷÎ, ½ÇÆÐÇÑ´Ù.
4 abcb ´Ù½Ã µ¹¾Æ¿Â´Ù, [bcd]*°¡ Çϳª ÀÌÇÏÀÇ ¹®ÀÚ¿¡ ÀÏÄ¡ÇÑ´Ù.
5 Failure ´Ù½Ã b¸¦ ½ÃµµÇÏÁö¸¸, ÇöÀç À§Ä¡°¡ ¸¶Áö¸· ¹®ÀÚÀÌ´Ù. Áï "d"ÀÌ´Ù.
6 abc ´Ù½Ã µ¹¾Æ¿Â´Ù, ±×·¡¼­ [bcd]*´Â ¿ÀÁ÷ "bc"¿¡¸¸ ÀÏÄ¡ÇÑ´Ù.
6 abcb ´Ù½Ã b¸¦ ½ÃµµÇÑ´Ù. ±×·¯³ª ÀÌ ¹ø¿¡´Â ÇöÀç À§Ä¡ÀÇ ¹®ÀÚ°¡ "b"ÀÌ°í, ±×·¡¼­ ¼º°øÇÑ´Ù.

ÀÌÁ¦ REÀÇ ¸¶Áö¸·¿¡ ´Ù´Ù¶ú´Ù. ±×¸®°í "abcb"¿¡ ÀÏÄ¡Çß´Ù. ÀÌ´Â ¾î¶»°Ô ÀÏÄ¡ ¿£ÁøÀÌ ¸ÕÀú ÃÖ´ëÇÑ ¸Ö¸® °¡´ÂÁö º¸¿©ÁØ´Ù. ¸¸¾à ¾Æ¹« ÀÏÄ¡µµ ¹ß°ßÇÏÁö ¸øÇÏ¸é ¼øÂ÷ÀûÀ¸·Î ´Ù½Ã µ¹¾Æ¿Í REÀÇ ³²Àº ºÎºÐÀ» °è¼ÓÇؼ­ ¹Ýº¹ÀûÀ¸·Î ½ÃµµÇÑ´Ù. [bcd]*¿¡ ´ëÇÏ¿© ¾î¶² ÀÏÄ¡µµ ¹ß°ßÇÏÁö ¸øÇÒ ¶§±îÁö µ¹¾Æ ¿Ã °ÍÀÌ´Ù. ±×¸®°í ÀÕ´Þ¾Æ ½ÇÆÐÇϸé, ÀÏÄ¡ ¿£ÁøÀº ±× ¹®ÀÚ¿­ÀÌ RE¿¡ ÀüÇô ÀÏÄ¡ÇÏÁö ¾Ê´Â´Ù°í °á·ÐÀ» ³»¸± °ÍÀÌ´Ù.

¶Ç´Ù¸¥ ¹Ýº¹ ¸ÞŸ¹®ÀÚ´Â +Àε¥, ÀÌ´Â 1ȸ ÀÌ»ó ÀÏÄ¡ÇÑ´Ù. *¿Í +ÀÇ Â÷ÀÌ¿¡ ÁÖÀǸ¦ ±â¿ïÀÌÀÚ; *´Â 0ȸ ÀÌ»ó ÀÏÄ¡ÇϹǷÎ, ±×·¡¼­ ¹Ýº¹µÇ´Â °ÍÀÌ ÀüÇô Á¸ÀçÇÏÁö ¾ÊÀ» ¼öµµ ÀÖÁö¸¸, ¹Ý¸é¿¡ +´Â Àû¾îµµ ÇÑ ¹øÀÇ ÃâÇöÀ» ¿ä±¸ÇÑ´Ù. ºñ½ÁÇÑ ¿¹¸¦ µé¾î º¸¸é, ca+t´Â "cat" (1 "a"), "caaat" (3 "a"'s)¿¡ ÀÏÄ¡ÇÏÁö¸¸, "ct"¿¡´Â ÀÏÄ¡ÇÏÁö ¾Ê´Â´Ù.

¹Ýº¹ ¼ö½ÄÀÚ°¡ µÎ °¡Áö ´õ ÀÖ´Ù. ¹°À½Ç¥ ¹®ÀÚ ?´Â 0ȸ ¶Ç´Â 1ȸ ÀÏÄ¡ÇÑ´Ù; Áï ¹«¾ð°¡°¡ ¼±ÅÃÀûÀÎ °ÍÀ¸·Î Ç¥½Ä¼³Á¤µÇ¾î ÀÖ´Â °ÍÀ̶ó°í °£ÁÖÇصµ ÁÁ´Ù. ¿¹¸¦ µé¾î, home-?brew´Â "homebrew" ¶Ç´Â "home-brew"¿¡ ÀÏÄ¡ÇÑ´Ù.

°¡Àå º¹ÀâÇÑ ¹Ýº¹ ¼ö½ÄÀÚ´Â {m,n}Àε¥, ¿©±â¿¡¼­ m°ú nÀº ½ÊÁø Á¤¼öÀÌ´Ù. ÀÌ ¼ö½ÄÀÚ´Â ÃÖ¼Ò mȸÀÇ ¹Ýº¹°ú, ÃÖ´ë nȸ°¡ ¹Ýº¹µÊÀ» ÀǹÌÇÑ´Ù. ¿¹¸¦ µé¾î, a/{1,3}b´Â "a/b", "a//b", ±×¸®°í "a///b"¿¡ ÀÏÄ¡µÈ´Ù. "ab"¿¡´Â ÀÏÄ¡ÇÏÁö ¾Ê´Âµ¥, ÀÌ´Â »ç¼±ÀÌ ¾ø±â ¶§¹®À̸ç, ¶Ç´Â "a////b"¿¡µµ ÀÏÄ¡ÇÏÁö ¾Ê´Âµ¥, ÀÌ´Â »ç¼±ÀÌ ³×°³À̱⠶§¹®ÀÌ´Ù.

m ¶Ç´Â nÀ» »ý·«Çصµ ÁÁ´Ù; ÀÌ °æ¿ì¿¡, »ý·«µÈ °ª¿¡ ´ëÇÏ¿© ÇÕ¸®ÀûÀÎ °ªÀÌ ÃßÁ¤µÈ´Ù. mÀ» »ý·«Çϸé 0À¸·Î ¹ø¿ªµÇ´Âµ¥, ¹Ý¸é¿¡ nÀ» »ý·«Çϸé ÃÖ´ë ¹«ÇÑ °ªÀÌ µÈ´Ù -- ½ÇÁ¦·Î, ¾Õ¿¡¼­ 20¾ïÀÌ ÇÑ°è¶ó°í ¾ð±ÞÇßÁö¸¸, ±× Á¤µµ¸é ¹«ÇÑÀ̶ó°í Çصµ ÁÁÀ» °Í °°´Ù.

°£°áÇÏ°Ô Ã³¸®Çϱ⸦ ÁÁ¾ÆÇÏ´Â µ¶ÀÚ¶ó¸é ³ª¸ÓÁö ´Ù¸¥ ¼ö½ÄÀÚ°¡ ¸ðµÎ ´ÙÀ½ Ç¥±â¹ýÀ¸·Î Ç¥ÇöµÉ ¼ö ÀÖ´Ù´Â °ÍÀ» ´«Ä¡Ã«À» °ÍÀÌ´Ù. {0,}´Â *ÀÌ°í, {1,}´Â +¿Í µ¿µîÇϸç, ±×¸®°í {0,1}Àº ?¿Í ¶È°°´Ù. ´õ ª°í Àбâ ÆíÇϱ⠶§¹®¿¡ °¡´ÉÇϸé *, +, ¶Ç´Â ?¸¦ »ç¿ëÇÏ´Â ÆíÀÌ ÁÁ´Ù.

3 Á¤±Ô Ç¥Çö½Ä »ç¿ëÇϱâ

°£´ÜÇÑ ¸î°¡Áö Á¤±Ô Ç¥Çö½ÄÀ» µÑ·¯ º¸¾Ò´Ù. ±×·¸ÇÏ¸é ¾î¶»°Ô ½ÇÁ¦·Î Á¤±Ô Ç¥Çö½ÄÀ» ÆÄÀ̽㿡¼­ »ç¿ëÇϴ°¡? re ¸ðµâÀÌ Á¤±Ô Ç¥Çö½Ä¿¡ ´ëÇÑ ÀÎÅÍÆäÀ̽º¸¦ Á¦°øÇÏ¿© ÁֹǷÎ, RE¸¦ °´Ã¼·Î ÄÄÆÄÀÏÇؼ­ ±×µé¿¡ ´ëÇØ ÀÏÄ¡¸¦ ¼öÇàÇÒ ¼ö ÀÖ´Ù.

3.1 Á¤±Ô Ç¥Çö½Ä ÄÄÆÄÀÏÇϱâ

Á¤±Ô Ç¥Çö½ÄÀº RegexObject ½Çü·Î ÄÄÆÄÀϵȴÙ. ÀÌ´Â ´Ù¾çÇÑ ¿¬»êÀ» À§ÇÑ ¸Þ½îµå¸¦ °¡Áö°í À־ ÆÐÅÏ ÀÏÄ¡¸¦ ã°Å³ª ¹®ÀÚ¿­ ´ëÄ¡¸¦ ¼öÇàÇÑ´Ù.

>>> import re
>>> p = re.compile('ab*')
>>> print p
<re.RegexObject instance at 80b4150>

re.compile()Àº ¶ÇÇÑ ¼±ÅÃÀûÀΠǥ½Ä(flags) Àμö¸¦ ¹Þ´Â´Ù. ÀÌ Àμö¸¦ »ç¿ëÇÏ¸é ´Ù¾çÇÑ Æ¯¼ö Ư¡µé°ú ±¸¹®À» »ç¿ëÇÒ ¼ö ÀÖ´Ù. ³ªÁß¿¡ »ç¿ë°¡´ÉÇÑ ¼³Á¤°ªµéÀ» °ËÅäÇØ º¸°ÚÁö¸¸, ÇöÀç·Î¼­´Â ÇÑ°¡Áö ¿¹Á¦¸¸À¸·Îµµ ÃæºÐÇÒ °ÍÀÌ´Ù:

>>> p = re.compile('ab*', re.IGNORECASE)

RE´Â re.compile()¿¡ ¹®ÀÚ¿­·Î °Ç³×Áø´Ù. RE´Â Á¤±Ô Ç¥Çö½ÄÀÌ ÄÚ¾î ÆÄÀ̽㠾ð¾îÀÇ ÀϺΰ¡ ¾Æ´Ï±â ¶§¹®¿¡ ¹®ÀÚ¿­·Î 󸮵ȴÙ. ±×¸®°í Á¤±Ô Ç¥Çö½ÄÀ» Ç¥ÇöÇϴµ¥ ¾î¶² Ưº°ÇÑ ±¸¹®µµ ¸¸µé¾îÁöÁö ¾Ê´Â´Ù. (RE°¡ ÀüÇô ÇÊ¿äÇÏÁö ¾ÊÀº ¾îÇø®ÄÉÀ̼ǵµ À־, Á¤±Ô Ç¥Çö½ÄÀ» Æ÷ÇÔÇß´Ù°í ÀÚ¶ûÇÒ ÇÊ¿ä°¡ ¾ø´Ù.) ´ë½Å, re ¸ðµâÀº ±×³É ÆÄÀ̽㿡 Æ÷ÇÔµÈ C È®Àå ¸ðµâÀÌ´Ù. ¸¶Ä¡ socket ¸ðµâÀ̳ª zlib ¸ðµâó·³ ¸»ÀÌ´Ù.

¹®ÀÚ¿­·Î RE¸¦ Ç¥ÇöÇϸé ÆÄÀ̽㠾ð¾î´Â ´õ °£´ÜÇÏÁö¸¸, ´ÜÁ¡ÀÌ Çϳª Àִµ¥ ´ÙÀ½ ¼½¼ÇÀÇ ÁÖÁ¦·Î »ï°Ú´Ù.

3.2 °í¹Î°Å¸® ¿ª»ç¼±

ÀÌÀü¿¡ ¾ð±ÞÇÑ ¹Ù¿Í °°ÀÌ, Á¤±Ô Ç¥Çö½ÄÀº ¿ª»ç¼± ¹®ÀÚ ("\")¸¦ »ç¿ëÇÏ¿© ±×ÀÇ Æ¯º°ÇÑ Àǹ̸¦ ¿äûÇÏÁö ¾Ê°í Ưº°ÇÑ ÇüŸ¦ ³ªÅ¸³»°Å³ª Ưº°ÇÑ ¹®ÀÚ¸¦ »ç¿ëÇϵµ·Ï Çã¿ëÇÑ´Ù. ÀÌ´Â ÆÄÀ̽ãÀÌ °°Àº ¹®ÀÚ¸¦ °°Àº ¸ñÀûÀ¸·Î ¹®ÀÚ¿­ ±âÈ£¹®ÀÚ¿¡ »ç¿ëÇÏ´Â °Í°ú Ãæµ¹ÇÑ´Ù.

RE¸¦ ¹®ÀÚ¿­ "\section"¿¡ ÀÏÄ¡½ÃÄÑ º¸°í ½Í´Ù°í ÇÏÀÚ, ÀÌ´Â LATEX ÆÄÀÏ¿¡¼­ º½Á÷ÇÏ´Ù. ÇÁ·Î±×·¥ Äڵ忡 ¹«¾ùÀ» ¾µÁö °¡´ÆÇÏ·Á¸é, ¸ÕÀú ÀÏÄ¡½ÃÅ°±â¸¦ ¿øÇÏ´Â ¹®ÀÚ¿­·Î ½ÃÀÛÇÏÀÚ. ´ÙÀ½À¸·Î, ¿ª»ç¼±À» ¾Õ¿¡ µÎ¾î¼­ ¿ª»ç¼±°ú ±âŸ ¸ÞŸ¹®ÀÚµéÀ» ÇǽŽÃÅ°°í "\\section" ¹®ÀÚ¿­À» ¸¸µé¾î¾ß ÇÑ´Ù. re.compile()À¸·Î °Ç³×¾ß ÇÏ´Â °á°ú ¹®ÀÚ¿­Àº ¹Ýµå½Ã \\sectionÀ̾î¾ß ÇÑ´Ù. ±×·¸Áö¸¸, À̸¦ ÆÄÀ̽㠹®ÀÚ¿­ ±âÈ£¹®ÀڷΠǥÇöÇÏ·Á¸é, ¿ª»ç¼± µÎ °³ ¸ðµÎ¸¦ ¶Ç´Ù½Ã ÇǽŽÃÄÑ¾ß ÇÑ´Ù.

¹®ÀÚ  ´Ü°è 
\section ÀÏÄ¡½Ãų ÅؽºÆ® ¹®ÀÚ¿­
\\section re.compileÀ» À§ÇØ ÇǽŽÃŲ ¿ª»ç¼±
"\\\\section" ¹®ÀÚ¿­ ±âÈ£¹®ÀÚ¸¦ À§ÇØ ÇǽŽÃŲ ¿ª»ç¼±

°£´ÜÈ÷ ¸»ÇØ, ±âÈ£¹®ÀÚ ¿ª»ç¼±À» ÀÏÄ¡½ÃÅ°·Á¸é, RE ¹®ÀÚ¿­·Î '\\\\'¶ó°í ½á¾ß Çϴµ¥, Á¤±Ô Ç¥Çö½ÄÀº "\\"À̾î¾ß ÇÏ°í, °¢ ¿ª»ç¼±Àº Á¤±Ô ÆÄÀ̽㠹®ÀÚ¿­ ±âÈ£¹®ÀÚ ¾È¿¡¼­ "\\"¶ó°í Ç¥ÇöµÇ¾î¾ß Çϱ⠶§¹®ÀÌ´Ù. RE¿¡¼­ ¿ª»ç¼±À» ¹Ýº¹ÀûÀ¸·Î »ç¿ëÇØ¾ß ÇÑ´Ù¸é, ÀÌ´Â ¼ö ¸¹Àº ¿ª»ç¼±ÀÇ ¹Ýº¹À¸·Î À̾îÁ®¾ß ÇÏ°í °á°ú ¹®ÀÚ¿­À» ÀÌÇØÇϱ⠾î·Æ°Ô µÈ´Ù.

ÇØ°áÃ¥Àº ÆÄÀ̽ãÀÇ ³¯ ¹®ÀÚ¿­ Ç¥±â¹ýÀ» Á¤±Ô Ç¥Çö½Ä¿¡ »ç¿ëÇÏ´Â °ÍÀÌ´Ù; ¿ª»ç¼±Àº "r"ÀÌ Á¢µÎ»ç·Î µÈ ¹®ÀÚ¿­ ±âÈ£¹®ÀÚ ¾È¿¡¼­´Â ¾î¶² Ưº°ÇÑ ¹æ¹ýÀ¸·Î ´Ù·ç¾îÁöÁö ¾Ê´Â´Ù, ±×·¡¼­ r"\n"Àº µÎ°³ÀÇ ¹®ÀÚ ¹®ÀÚ¿­·Î¼­ "\"¿Í "n"¸¦ ´ã°í Àִµ¥, ¹Ý¸é¿¡ "\n"Àº ÇÑ°³Â¥¸® ¹®ÀÚ¿­·Î¼­ »õÁÙ¹®ÀÚ¸¦ ´ã°í ÀÖ´Ù. ¾ÆÁÖ ÀÚÁÖ Á¤±Ô Ç¥Çö½ÄÀº ÆÄÀ̽ã Äڵ忡¼­ ÀÌ·± ³¯ ¹®ÀÚ¿­ Ç¥±â¹ýÀ¸·Î Ç¥ÇöµÈ´Ù.

Á¤±Ô Ç¥Çö½Ä  ³¯ ¹®ÀÚ¿­ 
"ab*" r"ab*"
"\\\\section" r"\\section"
"\\w+\\s+\\1" r"\w+\s+\1"

3.3 ÀÏÄ¡½ÃÄÑ º¸±â

ÄÄÆÄÀÏµÈ Á¤±Ô Ç¥Çö½ÄÀ» ³ªÅ¸³»´Â °´Ã¼¸¦ È®º¸Çß´Ù°í Çϸé, ±×°ÍÀ¸·Î ¹«¾ùÀ» ÇÒ °ÍÀΰ¡? RegexObject ½Çü´Â ¿©·¯ ¸Þ½îµå¿Í ¼Ó¼ºÀ» °¡Áö°í ÀÖ´Ù. °¡Àå Áß¿äÇÑ °Íµé¸¸ ¿©±â¿¡¼­ ´Ù·ç¾î º¸°Ú´Ù; ¿Ïº®ÇÑ ¸ñ·ÏÀº ¶óÀ̺귯¸® ÂüÁ¶¼­¸¦ Âü°íÇÏÀÚ.

¸Þ½îµå/¼Ó¼º  ¸ñÀû 
match() ¹®ÀÚ¿­ÀÇ Ã³À½¿¡¼­ RE°¡ ÀÏÄ¡ÇÏ´ÂÁö °áÁ¤ÇÑ´Ù.
search() ¹®ÀÚ¿­À» Äf¾î¼­, RE°¡ ÀÏÄ¡ÇÏ´Â À§Ä¡¸¦ ã´Â´Ù.
findall() RE°¡ ÀÏÄ¡ÇÏ´Â °÷ÀÇ ¸ðµç ÇϺι®ÀÚ¿­À» ã¾Æ¼­, ±× ¹®ÀÚ¿­µéÀ» ¸®½ºÆ®·Î ¹ÝȯÇÑ´Ù.
finditer() RE°¡ ÀÏÄ¡ÇÏ´Â °÷ÀÇ ¸ðµç ÇϺι®ÀÚ¿­À» ã¾Æ¼­, ±× ¹®ÀÚ¿­µéÀ» ¹Ýº¹ÀÚ·Î ¹ÝȯÇÑ´Ù.

match()¿Í search()´Â ¾Æ¹« ÀÏÄ¡µµ ¹ß°ßÇÏÁö ¸øÇϸé NoneÀ» ¹ÝȯÇÑ´Ù. ¼º°øÀûÀ¸·Î ¹ß°ßÇϸé MatchObject ½Çü°¡ ¹ÝȯµÇ´Âµ¥, ¿©±â¿¡´Â ±× ÀÏÄ¡¿¡ °üÇÑ Á¤º¸°¡ ´ã±â¾î ÀÖ´Ù: ¾îµð¿¡¼­ ½ÃÀÛÇÏ°í ³¡³ª´ÂÁö, ÀÏÄ¡µÈ ÇϺι®ÀÚ¿­, µîµî.

re ¸ðµâÀ» °¡Áö°í »óÈ£´ëÈ­ÀûÀ¸·Î ½ÇÇèÇØ º¸¸é ÀÌ¿¡ ´ëÇÏ¿© ¾Ë ¼ö ÀÖ´Ù. Tkinter¸¦ »ç¿ëÇÒ ¼ö ÀÖÀ¸¸é, ÆÄÀ̽㠹èÆ÷º»¿¡ Æ÷ÇÔµÈ µ¥¸ð ÇÁ·Î±×·¥ÀÎ Tools/scripts/redemo.py¸¦ º¸°í ½ÍÀ» °ÍÀÌ´Ù. ÀÌ µ¥¸ð ÇÁ·Î±×·¥¿¡¼­ RE¿Í ¹®ÀÚ¿­À» ÀÔ·ÂÇϸé, RE°¡ ÀÏÄ¡ÇÏ´ÂÁö ½ÇÆÐÇÏ´ÂÁö È­¸é¿¡ º¸¿©ÁØ´Ù. redemo.py´Â º¹ÀâÇÑ RE¸¦ µð¹ö±×ÇÏ°í ½ÍÀ» ¶§ ¾ÆÁÖ ¾µ¸ð°¡ ÀÖ´Ù. ÇÊ ½´¹Ù¸£Âê(Phil Schwartz)ÀÇ Kodosµµ ¶ÇÇÑ »óÈ£´ëÈ­ÀûÀÎ µµ±¸·Î¼­ RE ÆÐÅÏÀ» Å×½ºÆ®ÇÏ°í °³¹ßÇϴµ¥ »ç¿ëµÈ´Ù. ÀÌ HOWTO´Â Ç¥ÁØ ÆÄÀ̽ãÀ» ¿¹Á¦·Î »ç¿ëÇÒ °ÍÀÌ´Ù.

¸ÕÀú, ÆÄÀ̽ãÀ» ½ÇÇàÇÏ°í, re ¸ðµâÀ» ¼öÀÔÇÑ ´ÙÀ½, RE¸¦ ÄÄÆÄÀÏ ÇÑ´Ù:

Python 2.2.2 (#1, Feb 10 2003, 12:57:01)
>>> import re
>>> p = re.compile('[a-z]+')
>>> p
<_sre.SRE_Pattern object at 80c3c28>

ÀÌÁ¦, ´Ù¾çÇÑ ¹®ÀÚ¿­À» RE [a-z]+¿¡ ÀÏÄ¡½ÃÄÑ º¼ ¼ö ÀÖ´Ù. ºó ¹®ÀÚ¿­Àº Àý´ë·Î ÀÏÄ¡µÇÁö ¾Ê´Âµ¥, ¿Ö³ÄÇϸé +´Â '1ȸ ÀÌ»óÀÇ ¹Ýº¹'À» ÀǹÌÇϱ⠶§¹®ÀÌ´Ù. match()´Â ÀÌ °æ¿ì¿¡ NoneÀ» ¹ÝȯÇÒ °ÍÀÌ´Ù. ±×·¡¼­ ÆÄÀ̽㿡´Â ¾Æ¹«°Íµµ ÀμâµÇÁö ¾Ê´Â´Ù. ÀÌ Á¡À» ¸íÈ®È÷ Çϱâ À§ÇÏ¿© ¸í½ÃÀûÀ¸·Î match()ÀÇ °á°ú¸¦ ÀμâÇØ º¼ ¼ö ÀÖ´Ù.

>>> p.match("")
>>> print p.match("")
None

ÀÌÁ¦, ÀÏÄ¡ µÉ ¸¸ÇÑ ¹®ÀÚ¿­, ¿¹¸¦ µé¾î "tempo"¿Í °°Àº ¹®ÀÚ¿­¿¡ ½ÃµµÇØ º¸ÀÚ. ÀÌ °æ¿ì¿¡ match()´Â MatchObject¸¦ ¹ÝȯÇÒ °ÍÀÌ°í, ±×·¡¼­ ±× °á°ú¸¦ ³ªÁß¿¡ »ç¿ëÇϱâ À§ÇØ ÀúÀåÇØ µÎ¾î¾ß ÇÑ´Ù.

>>> m = p.match( 'tempo')
>>> print m
<_sre.SRE_Match object at 80c4f68>

ÀÌÁ¦ ÀÏÄ¡µÈ ¹®ÀÚ¿­¿¡ °üÇÏ¿© Á¤º¸¸¦ MatchObject¿¡ ÁúÀÇÇØ º¼ ¼ö ÀÖ´Ù. MatchObject ½Çü´Â ¶ÇÇÑ ¿©·¯ ¸Þ½îµå¿Í ¼Ó¼ºÀÌ ÀÖ´Ù; °¡Àå Áß¿äÇÑ °ÍµéÀº ´ÙÀ½°ú °°´Ù:

¸Þ½îµå/¼Ó¼º  ¸ñÀû 
group() RE¿¡ ÀÏÄ¡µÈ ¹®ÀÚ¿­À» ¹ÝȯÇÑ´Ù
start() ÀÏÄ¡µÈ ¹®ÀÚ¿­ÀÇ ½ÃÀÛ À§Ä¡¸¦ ¹ÝȯÇÑ´Ù
end() ÀÏÄ¡µÈ ¹®ÀÚ¿­ÀÇ ³¡ À§Ä¡¸¦ ¹ÝȯÇÑ´Ù
span() ÀÏÄ¡ À§Ä¡¸¦ (start, end)ÀÇ ÅÍÇ÷Π¹ÝȯÇÑ´Ù

ÀÌ·± ¸Þ½îµåµéÀ» ½ÃÇèÇØ º¸¸é °ð ±× Àǹ̸¦ ÀÌÇØÇÏ°Ô µÈ´Ù:

>>> m.group()
'tempo'
>>> m.start(), m.end()
(0, 5)
>>> m.span()
(0, 5)

group()Àº RE¿¡ ÀÏÄ¡µÈ ÇϺι®ÀÚ¿­À» ¹ÝȯÇÑ´Ù. start()¿Í end()´Â °¢°¢ ÀÏÄ¡µÈ ¹®ÀÚ¿­ÀÇ ½ÃÀÛ ÁöÇ¥¿Í ³¡ À§Ä¡¸¦ ¹ÝȯÇÑ´Ù. span()Àº ½ÃÀÛ À§Ä¡¿Í ³¡ ÁöÇ¥¸¦ ÇϳªÀÇ ÅÍÇ÷Π¹ÝȯÇÑ´Ù. match ¸Þ½îµå´Â RE°¡ ¹®ÀÚ¿­ÀÇ Ã³À½¿¡¼­ ÀÏÄ¡ÇÏ´ÂÁö¸¦ Á¡°ËÇÒ »ÓÀ̱⠶§¹®¿¡, start()´Â ¾ðÁ¦³ª 0ÀÏ °ÍÀÌ´Ù. ±×·¸Áö¸¸, RegexObject ½ÇüÀÇ search ¸Þ½îµå´Â ¹®ÀÚ¿­À» Äf±â ¶§¹®¿¡, ÀÏÄ¡ À§Ä¡°¡ 0ÀÌ ¾Æ´Ò ¼öµµ ÀÖ´Ù.

>>> print p.match('::: message')
None
>>> m = p.search('::: message') ; print m
<re.MatchObject instance at 80c9650>
>>> m.group()
'message'
>>> m.span()
(4, 11)

½ÇÁ¦ ÇÁ·Î±×·¥¿¡¼­, °¡Àå ÀϹÝÀûÀÎ ½ºÅ¸ÀÏÀº MatchObject¸¦ º¯¼ö¿¡ ÀúÀåÇÏ°í³ª¼­, ±×°ÍÀÌ NoneÀÎÁö Á¡°ËÇÏ´Â °ÍÀÌ´Ù. ÀÌ´Â º¸Åë ´ÙÀ½°ú °°ÀÌ º¸ÀδÙ:

p = re.compile( ... )
m = p.match( 'string goes here' )
if m:
    print 'Match found: ', m.group()
else:
    print 'No match'

µÎ°³ÀÇ RegexObject ¸Þ½îµå°¡ ÇÑ ÆÐÅÏ¿¡ °üÇÏ¿© ÀÏÄ¡µÈ ¸ðµç °ÍµéÀ» ¹ÝȯÇÑ´Ù. findall()Àº ÀÏÄ¡µÈ ¹®ÀÚ¿­µéÀ» ´ãÀº ¸®½ºÆ®¸¦ ¹ÝȯÇÑ´Ù:

>>> p = re.compile('\d+')
>>> p.findall('12 drummers drumming, 11 pipers piping, 10 lords a-leaping')
['12', '11', '10']

findall()Àº Àüü ¸®½ºÆ®¸¦ ¸¸µé¾î¾ß¸¸ °á°ú·Î ¹ÝȯÇÒ ¼ö ÀÖ´Ù. ÆÄÀ̽ã 2.2¿¡¼­´Â finditer() ¸Þ½îµåµµ »ç¿ëÇÒ ¼ö Àִµ¥, MatchObject ½ÇüÀÇ ¿¬¼Ó¿­À» ¹Ýº¹ÀÚ·Î ¹ÝȯÇÑ´Ù.

>>> iterator = p.finditer('12 drummers drumming, 11 ... 10 ...')
>>> iterator
<callable-iterator object at 0x401833ac>
>>> for match in iterator:
...     print match.span()
...
(0, 2)
(22, 24)
(29, 31)

3.4 ¸ðµâ-¼öÁØÀÇ ÇÔ¼ö

RegexObjectÀ» ¸¸µé°í ±×ÀÇ ¸Þ½îµå¸¦ È£ÃâÇÒ ÇÊ¿ä°¡ ¾ø´Ù; re ¸ðµâÀº match(), search(), sub(), µîµîÀÇ ÃÖ»óÀ§ ¼öÁØÀÇ ÇÔ¼ö¸¦ Á¦°øÇϱ⵵ ÇÑ´Ù. ÀÌ ÇÔ¼öµéÀº RegexObject ¸Þ½îµå¿¡ »óÀÀÇÏ´Â ÀμöµéÀ» ÃëÇؼ­, RE ¹®ÀÚ¿­À» ±×ÀÇ Ã¹ Àμö·Î ´õÇÏ°í, ±×¸®°í ¿©ÀüÈ÷ NoneÀ̳ª MatchObject ½Çü¸¦ ¹ÝȯÇÑ´Ù.

>>> print re.match(r'From\s+', 'Fromage amk')
None
>>> re.match(r'From\s+', 'From amk Thu May 14 19:12:10 1998')
<re.MatchObject instance at 80c5978>

¾ÈÀ» µé¿©´Ù º¸¸é, ÀÌ ÇÔ¼öµéÀº ±×³É ¿©·¯ºÐÀ» À§ÇÏ¿© RegexObject¸¦ ¸¸µé°í °Å±â¿¡´Ù ±×¿¡ ÀûÀýÇÑ ¸Þ½îµå¸¦ ¿äûÇÑ´Ù. ¶ÇÇÑ ÄÄÆÄÀÏµÈ °´Ã¼¸¦ ij½¬¿¡ ÀúÀåÇϱ⵵ ÇÏ¿©¼­, ¾ÕÀ¸·Î °°Àº RE¸¦ »ç¿ëÇÏ¿© È£ÃâµÇ¸é ´õ ºü¸£°Ô ¼öÇàµÈ´Ù.

ÀÌ·± ¸ðµâ-¼öÁØÀÇ ÇÔ¼ö¸¦ »ç¿ëÇØ¾ß ÇÒ±î, ¾Æ´Ï¸é RegexObject¸¦ È®º¸Çؼ­ ±×ÀÇ ¸Þ½îµåµéÀ» Á÷Á¢ È£ÃâÇØ¾ß ÇÒ±î? ¼±ÅÃÀº ¾ó¸¶³ª ÀÚÁÖ ±× RE°¡ »ç¿ëµÉ °ÍÀΰ¡¿¡ ´Þ·Á ÀÖ°í, °³ÀÎÀûÀÎ ÄÚµù ½ºÅ¸ÀÏ¿¡ ´Þ·Á ÀÖ´Ù. RE°¡ Äڵ忡¼­ ÇÑ °÷¿¡¼­¸¸ »ç¿ëµÈ´Ù¸é, ¸ðµâ ÇÔ¼ö°¡ ¾Æ¸¶µµ ´õ Æí¸®ÇÒ °ÍÀÌ´Ù. ÇÁ·Î±×·¥ÀÌ ¼ö ¸¹Àº Á¤±Ô Ç¥Çö½ÄÀ» ´ã°í Àְųª, °°Àº Á¤±Ô Ç¥Çö½ÄÀ» ¿©·¯ °÷¿¡¼­ Àç»ç¿ëÇÑ´Ù¸é, ¸ðµç Á¤ÀǵéÀ» ÇÑ °÷¿¡ ¸ð¾Æ¼­, ÄÚµåÀÇ ÇÑ ºÎºÐ¿¡¼­ ¸ðµç RE¸¦ ¹Ì¸® ÄÄÆÄÀÏ ÇÏ´Â ÆíÀÌ ´õ °¡Ä¡°¡ ÀÖÀ» °ÍÀÌ´Ù. Ç¥ÁØ ¶óÀ̺귯¸®¿¡¼­ ¿¹Á¦¸¦ Çϳª ÃëÇÏÀÚ¸é, xmllib.py¿¡¼­ Çϳª¸¦ »Ì¾Æ º¸°Ú´Ù:

ref = re.compile( ... )
entityref = re.compile( ... )
charref = re.compile( ... )
starttagopen = re.compile( ... )

ÀϹÝÀûÀ¸·Î ³ª´Â ´Ü Çѹø¸¸ »ç¿ëÇÒ ¶§¿¡µµ ÄÄÆÄÀÏµÈ °´Ã¼·Î ÀÛ¾÷ÇÏ´Â ÆíÀ» ¼±È£ÇÑ´Ù. ±×·¯³ª ³ª¸¸ÇÑ ¼ø¼öÁÖÀÇÀÚ´Â º°·Î ¾øÀ» °ÍÀÌ´Ù.

3.5 ÄÄÆÄÀÏ Ç¥½Ä

ÄÄÆÄÀÏ Ç¥½ÄÀ¸·Î Á¤±Ô Ç¥Çö½ÄÀÌ ¾î¶»°Ô ÀÛµ¿ÇÒ °ÍÀΰ¡¿¡ °üÇÑ ¸ð½ÀÀ» º¯°æÇÒ ¼ö ÀÖ´Ù. Ç¥½ÄÀº re ¸ðµâ¿¡¼­ µÎ °¡Áö À̸§À» »ç¿ëÇÒ ¼ö Àִµ¥, ±ä À̸§À¸·Î IGNORECASE, ±×¸®°í ªÀº À̸§À¸·Î ÇϳªÂ¥¸®-±âÈ£ ÇüÅÂÀÎ I°¡ ÀÖ´Ù. (ÆÞÀÇ ÆÐÅÏ º¯°æÀÚ¸¦ Àß ¾È´Ù¸é, ÇϳªÂ¥¸®-±âÈ£ ÇüÅ´ °°Àº ±âÈ£¸¦ »ç¿ëÇÑ´Ù; ¿¹¸¦ µé¾î, ªÀº ÇüÅÂÀÇ re.VERBOSE´Â re.XÀÌ´Ù.) ºñÆ®º°·Î ³í¸®ÇÕ ¿¬»êÀ» ÇÏ¿© ¿©·¯ Ç¥½ÄÀÌ ÁöÁ¤µÉ ¼ö ÀÖ´Ù; ¿¹¸¦ µé¾î re.I | re.M´Â I Ç¥½Ä°ú M Ç¥½ÄÀ» ¸ðµÎ ¼³Á¤ÇÑ´Ù.

´ÙÀ½Àº »ç¿ë°¡´ÉÇÑ Ç¥½Ä Å×À̺íÀÌ´Ù. °¢°¢¿¡ ´ëÇÏ¿© º¸´Ù ÀÚ¼¼ÇÏ°Ô ¼³¸íÀ» ´Þ¾Ò´Ù.

Ç¥½Ä  Àǹ̠
DOTALL, S .À» »õÁÙ¹®ÀÚµµ Æ÷ÇÔÇÏ¿© ¾î¶² ¹®ÀÚ¿¡µµ ÀÏÄ¡Çϵµ·Ï ¸¸µç´Ù.
IGNORECASE, I ´ë¼Ò¹®ÀÚ-±¸º°¾øÀÌ ÀÏÄ¡½ÃŲ´Ù
LOCALE, L ·ÎÄÉÀÏÀ»-ÀνÄÇÏ¿© ÀÏÄ¡½ÃŲ´Ù
MULTILINE, M ¿©·¯-ÁÙ ÀÏÄ¡, ^¿Í $¿¡ ¿µÇâÀ» ¹ÌÄ£´Ù
VERBOSE, X RE¿¡ ¼³¸íÀ» ºÙÀÏ ¼ö ÀÖ´Ù. RE¸¦ ´õ ±ú²ýÇÏ°í ÀÌÇØÇϱ⠽±°Ô Á¶Á÷ÇÒ ¼ö ÀÖ´Ù.

I
IGNORECASE
´ë¼Ò¹®ÀÚ ºñ±¸º° ÀÏÄ¡¸¦ ¼öÇàÇÑ´Ù; ¹®ÀÚ ºÎ·ù¿Í ±âÈ£¹®ÀÚ ¹®ÀÚ¿­Àº ´ë¼Ò¹®ÀÚ¸¦ ¹«½ÃÇÏ°í ±âÈ£¿¡ ÀÏÄ¡ÇÑ´Ù. ¿¹¸¦ µé¾î, [A-Z]´Â ¼Ò¹®ÀÚ ±âÈ£¿¡µµ ¿ª½Ã ÀÏÄ¡ÇÒ °ÍÀÌ°í, SpamÀº "Spam", "spam", ¶Ç´Â "spAM"¿¡ ÀÏÄ¡ÇÒ °ÍÀÌ´Ù. ÀÌ·± ¼Ò¹®ÀÚº¯È¯Àº ÇöÀç ·ÎÄÉÀÏÀ» °í·ÁÇÏÁö ¾ÊÀº °ÍÀÌ´Ù; LOCALE Ç¥½ÄÀ» ¼³Á¤Çصµ ¸¶Âù°¡Áö´Ù.

L
LOCALE
\w, \W, \b, ±×¸®°í \B¸¦ ÇöÀç ·ÎÄÉÀÏ¿¡ ÀÇÁ¸ÇÏ°Ô ¸¸µç´Ù.

·ÎÄÉÀÏÀº ¾ð¾îÀÇ Â÷À̸¦ °í·ÁÇÏ´Â ÇÁ·Î±×·¥À» ¸¸µå´Âµ¥ µµ¿òÀ» ÁÙ ¸ñÀûÀ¸·Î ¸¸µé¾îÁø C ¶óÀ̺귯¸®ÀÇ Æ¯Â¡ÀÌ´Ù. ¿¹¸¦ µé¾î, ÇÁ¶û½º¾î ÅؽºÆ®¸¦ ó¸®ÇÏ°íÀÚ Çϸé, \w+¸¦ ´Ü¾î¿¡ ÀÏÄ¡½Ãų ¼ö ÀÖ¾úÀ¸¸é ÇÏ°í ¹Ù¶óÁö¸¸, \w´Â ¿ÀÁ÷ ¹®ÀÚ ºÎ·ù [A-Za-z]¿¡¸¸ ÀÏÄ¡ÇÒ »ÓÀÌ´Ù; ´Ù½Ã ¸»ÇØ "é" ¶Ç´Â "ç"¿¡ ÀÏÄ¡ÇÏÁö ¾Ê´Â´Ù. ½Ã½ºÅÛÀÌ Á¦´ë·Î ȯ°æ¼³Á¤µÇ¾î ÀÖ°í ÇÁ¶û½º¾î ·ÎÄÉÀÏÀÌ ¼±ÅõǾú´Ù¸é, ƯÁ¤ C ÇÔ¼öµéÀÌ ÇÁ·Î±×·¥¿¡°Ô "é"ÀÌ ±âÈ£·Î °£ÁֵǾî¾ß ÇÑ´Ù°í ¸»ÇØ ÁÙ °ÍÀÌ´Ù. Á¤±Ô Ç¥Çö½ÄÀ» ÄÄÆÄÀÏÇÒ ¶§ LOCALE Ç¥½ÄÀ» ¼³Á¤ÇØ ³õÀ¸¸é ±× °á°ú·Î ³ª¿Â ÄÄÆÄÀÏ °´Ã¼°¡ \w¿¡ ´ëÇÏ¿© ÀÌ·± C ÇÔ¼öµéÀ» »ç¿ëÇÏ°Ô µÈ´Ù; ÀÌ°ÍÀÌ ´õ ´À¸®Áö¸¸, \w+¸¦ ¿¹»ó´ë·Î ÇÁ¶û½º¾î ´Ü¾î¿¡ ÀÏÄ¡½ÃÅ°µµ·Ï ÇÒ ¼ö ÀÖ´Ù.

M
MULTILINE
(^ ±×¸®°í $´Â ¾ÆÁ÷ ¼³¸íÇÏÁö ¾Ê¾Ò´Ù; ÀÌ¿¡ ´ëÇؼ­´Â ¼½¼Ç 4.1¿¡¼­ ¼Ò°³ÇÒ »ý°¢ÀÌ´Ù.)

º¸Åë ^´Â ¹®ÀÚ¿­ÀÇ Ã³À½¿¡¼­¸¸ ÀÏÄ¡ÇÑ´Ù. ±×¸®°í $´Â ¹®ÀÚ¿­ÀÇ ³¡¿¡¼­¸¸ ÀÏÄ¡ÇÏ°í, (Ȥ½Ã ÀÖ´Ù¸é) ¹®ÀÚ¿­ÀÇ ³¡¿¡ »õÁÙ¹®ÀÚ ¹Ù·Î ¾Õ¿¡¼­ ÀÏÄ¡ÇÑ´Ù. ÀÌ Ç¥½ÄÀÌ ÁöÁ¤µÇ¸é, ^´Â ¹®ÀÚ¿­ÀÇ Ã³À½°ú ±× ¹®ÀÚ¿­¿¡¼­ ´ÙÀ½¿¡ »õÁÙ¹®ÀÚ°¡ ³ª¿À´Â Áï½Ã °¢ ÁÙÀÇ ½ÃÀÛ¿¡¼­ ÀÏÄ¡ÇÑ´Ù. ºñ½ÁÇÏ°Ô, $ ¸ÞŸ¹®ÀÚ´Â °¢ ÁÙÀÇ ³¡°ú ¹®ÀÚ¿­ÀÇ ³¡¿¡¼­ ÀÏÄ¡ÇÑ´Ù (°¢ »õÁÙ¹®ÀÚ ¹Ù·Î ¾Õ¿¡¼­).

S
DOTALL
Ư¼ö ¹®ÀÚ "."À» »õÁÙ¹®ÀÚ¸¦ Æ÷ÇÔÇÏ¿© ¾î¶² ¹®ÀÚ¿¡µµ ÀÏÄ¡ÇÏ°Ô ¸¸µç´Ù; ÀÌ Ç¥½ÄÀÌ ¾øÀ¸¸é, "."´Â »õÁÙ¹®ÀÚ¸¦ Á¦¿ÜÇÏ°í ¾î´À ¹®ÀÚ¿¡µµ ÀÏÄ¡ÇÑ´Ù.

X
VERBOSE
ÀÌ Ç¥½ÄÀ» »ç¿ëÇÏ¸é ´õ À¯¿¬ÇÏ°Ô Á¤±Ô Ç¥Çö½ÄÀÇ ¸ð¾çÀ» ¸¸µé¼ö À־ Á¤±Ô Ç¥Çö½ÄÀ» ´õ Àб⠽±°Ô ¸¸µé ¼ö ÀÖ´Ù. ÀÌ Ç¥½ÄÀÌ ÁöÁ¤µÇ¸é, RE ¹®ÀÚ¿­ ¾ÈÀÇ °ø¹éÀº ¹«½ÃµÈ´Ù. ´Ü °ø¹éÀÌ ¹®ÀÚ ºÎ·ù ¾È¿¡ Àְųª ¾Õ¿¡ ÇǽŵÇÁö ¾ÊÀº ¿ª»ç¼±ÀÌ ÀÖ´Â °æ¿ì´Â Á¦¿Ü µÈ´Ù; ÀÌ·¸°Ô Çϸé RE¸¦ º¸´Ù ¼±¸íÇÏ°Ô µé¿©¾²°í Á¶Á÷È­ÇÒ ¼ö ÀÖ´Ù. ¶ÇÇÑ RE ¾È¿¡ ÁÖ¼®À» ´Þ ¼ö µµ Àִµ¥ ¿£ÁøÀÌ ¹«½ÃÇÑ´Ù; ÁÖ¼®Àº "#"·Î Ç¥½ÃµÇ¸ç ÀÌ ¹®ÀÚ´Â ¹®ÀÚ ºÎ·ù ¾È¿¡ À־µµ ¾ÈµÇ°í ¾Õ¿¡ ÇǽŵÇÁö ¾Ê´Â ¿ª»ç¼±ÀÌ ¿Íµµ ¾ÈµÈ´Ù.

¿¹¸¦ µé¾î, ´ÙÀ½Àº re.VERBOSE¸¦ »ç¿ëÇÏ´Â REÀÌ´Ù; ÀбⰡ ¾ó¸¶³ª ´õ ½¬¿îÁö º¸ÀÚ.

charref = re.compile(r"""
 &[#]		     # ¼öÄ¡ °³Ã¼ ÂüÁ¶ÀÇ ½ÃÀÛ
 (
   [0-9]+[^0-9]      # ½ÊÁø ÇüÅÂ
   | 0[0-7]+[^0-7]   # ÆÈÁø ÇüÅÂ
   | x[0-9a-fA-F]+[^0-9a-fA-F] # ½ÊÀ°Áø ÇüÅÂ
 )
""", re.VERBOSE)

verbose°¡ ¼³Á¤µÇ¾î ÀÖÁö ¾ÊÀ¸¸é, RE´Â ´ÙÀ½Ã³·³ º¸ÀÏ °ÍÀÌ´Ù:

charref = re.compile("&#([0-9]+[^0-9]"
                     "|0[0-7]+[^0-7]"
                     "|x[0-9a-fA-F]+[^0-9a-fA-F])")

À§ÀÇ ¿¹Á¦¿¡¼­, ÆÄÀ̽ãÀÌ ¹®ÀÚ¿­ ±âÈ£¹®ÀÚµéÀ» ÀÚµ¿À¸·Î °áÇÕÇÏ¿© RE¸¦ ´õ ÀÛÀº Á¶ÀÛÀ¸·Î ºÎ¼ö¾úÁö¸¸, re.VERBOSE¸¦ »ç¿ëÇÑ ¹öÀüº¸´Ù ¿©ÀüÈ÷ ´õ ÀÌÇØÇϱ⠾î·Æ´Ù.

4 ÆÐÅÏ ÆÄ¿ö¿¡ ´ëÇÏ¿© ´õ ÀÚ¼¼È÷

Áö±Ý±îÁö´Â Á¤±Ô Ç¥Çö½ÄÀÇ ÀϺθ¦ ´Ù·ç¾î º¸¾ÒÀ» »ÓÀÌ´Ù. ÀÌ ¼½¼Ç¿¡¼­´Â, »õ·Î¿î ¸ÞŸ¹®ÀÚµé ¸î°¡Áö¸¦ ´Ù·ç¾î º¸°í, ±×·ìÀ» »ç¿ëÇÏ¿© ÀÏÄ¡µÈ ÅؽºÆ®ÀÇ ÀϺθ¦ ¿­¶÷ÇÏ´Â ¹ýÀ» ´Ù·ç¾î º¸°Ú´Ù.

 
4.1 ¸ÞŸ¹®ÀÚµéÀ» ´õ ÀÚ¼¼È÷

¾ÆÁ÷ ´Ù·ç¾î º¸Áö ¾ÊÀº ¸ÞŸ¹®ÀÚµéÀÌ ¸î°¡Áö ÀÖ´Ù. ±×µé ´ëºÎºÐÀ» ÀÌ ¼½¼Ç¿¡¼­ ´Ù·ç¾î º¸°Ú´Ù.

³²¾ÆÀÖ´Â ¸ÞŸ¹®ÀÚÁß ´Ù·ç¾î º¼ ¸ÞŸ¹®ÀÚ´Â 0-³Êºñ ¼±¾ðÀÌ´Ù. 0-³Êºñ ¼±¾ð ¹®Àڵ鿡¼­ ¿£ÁøÀº ¹®ÀÚ¿­¿¡¼­ ¾ÕÀ¸·Î ³ª¾Æ°¡Áö ¾Ê´Â´Ù; ´ë½Å¿¡, ÀüÇô ¹®ÀÚµéÀ» ¼ÒºñÇÏÁö ¾ÊÀ¸¸ç, ±×³É ¼º°øÇϰųª ½ÇÆÐÇÒ »ÓÀÌ´Ù. ¿¹¸¦ µé¾î, \b´Â ÇöÀç À§Ä¡°¡ ¾ð¾îÀÇ °æ°è¿¡ ÀÖ´Ù´Â ¼±¾ðÀÌ´Ù; À§Ä¡´Â \b¿¡ ÀÇÇؼ­ ÀüÇô º¯ÇÏÁö ¾Ê´Â´Ù. ÀÌ´Â °ð 0-³Êºñ ¼±¾ðÀÌ Àý´ë·Î ¹Ýº¹µÇÁö ¾Ê´Â´Ù´Â ¶æÀε¥, ÁÖ¾îÁø À§Ä¡¿¡¼­ ÇÑ ¹ø ÀÏÄ¡Çϸé, ¼ö ¾øÀÌ ¸¹Àº Ƚ¼ö¸¦ ÀÏÄ¡ÇÒ °ÍÀÌ »·Çϱ⠶§¹®ÀÌ´Ù.

|
´ë¾È, ¶Ç´Â ``or'' ¿¬»êÀÚÀÌ´Ù. A¿Í B°¡ Á¤±Ô Ç¥Çö½ÄÀ̶ó¸é, A|B´Â "A" ¶Ç´Â "B"¿¡ ÀÏÄ¡ÇÏ´Â ¾î´À ¹®ÀÚ¿­°úµµ ÀÏÄ¡ÇÑ´Ù. |´Â ¿©·¯-¹®ÀÚ ¹®ÀÚ¿­À» ±³Ã¼ÇÒ ¶§ ÇÕ¸®ÀûÀ¸·Î ÀÛµ¿ÇØ¾ß Çϱ⠶§¹®¿¡ ¿ì¼±¼øÀ§°¡ ¾ÆÁÖ ³·´Ù. Crow|Servo´Â "Crow"³ª "Servo"¿¡ ÀÏÄ¡ÇÏÁö¸¸, "Cro", "w" ¶Ç´Â "S", ±×¸®°í "ervo"¿¡´Â ÀÏÄ¡ÇÏÁö ¾Ê´Â´Ù.

±âÈ£¹®ÀÚ "|"¿¡ ÀÏÄ¡½ÃÅ°·Á¸é, \|À» »ç¿ëÇϰųª, ¶Ç´Â ´ÙÀ½°ú °°ÀÌ [|] ¹®ÀÚ ºÎ·ù ¾È¿¡ ½Î ³ÖÀÚ.

^
ÁÙÀÇ Ã³À½°ú ÀÏÄ¡ÇÑ´Ù. MULTILINE Ç¥½ÄÀÌ ¼³Á¤µÇ¾î ÀÖÁö ¾Ê´Â ÇÑ, ÀÌ´Â ±× ¹®ÀÚ¿­ÀÇ Ã³À½¿¡¸¸ ÀÏÄ¡ÇÒ °ÍÀÌ´Ù. MULTILINE ¸ðµå¿¡¼­, ÀÌ´Â ±× ¹®ÀÚ¿­ ¾È¿¡¼­ °¢ »õÁÙ¹®ÀÚ ´ÙÀ½°ú ¹Ù·Î ÀÏÄ¡ÇÑ´Ù.

¿¹¸¦ µé¾î, "From"À̶ó´Â ´Ü¾î¸¦ ÇÑ ÁÙÀÇ Ã³À½¿¡¸¸ ÀÏÄ¡½ÃÅ°°í ½ÍÀ¸¸é, »ç¿ëÇÒ RE´Â ^FromÀÌ´Ù.

>>> print re.search('^From', 'From Here to Eternity')
<re.MatchObject instance at 80c1520>
>>> print re.search('^From', 'Reciting From Memory')
None

$
ÁÙÀÇ ¸¶Áö¸·¿¡ ÀÏÄ¡ÇÑ´Ù, ÀÌ´Â ¹®ÀÚ¿­ÀÇ ³¡À¸·Î Á¤Àǵǰųª, ¶Ç´Â »õÁÙ¹®ÀÚ ´ÙÀ½ÀÇ À§Ä¡·Î Á¤ÀǵȴÙ.

>>> print re.search('}$', '{block}')
<re.MatchObject instance at 80adfa8>
>>> print re.search('}$', '{block} ')
None
>>> print re.search('}$', '{block}\n')
<re.MatchObject instance at 80adfa8>

±âÈ£¹®ÀÚ "$"¸¦ ÀÏÄ¡½ÃÅ°·Á¸é, \$¸¦ »ç¿ëÇϰųª ´ÙÀ½°ú °°ÀÌ [$] ¹®ÀÚ ºÎ·ù ¾È¿¡ ½Î ³ÖÀÚ.

\A
¹®ÀÚ¿­ÀÇ Ã³À½¿¡¸¸ ÀÏÄ¡ÇÑ´Ù. MULTILINE ¸ðµå°¡ ¾Æ´Ï¶ó¸é, \A¿Í ^´Â ±× È¿°ú°¡ °°´Ù. ±×·¸Áö¸¸ MULTILINE ¸ðµå¶ó¸é, È¿°ú°¡ ´Ù¸£´Ù; \A´Â ¿©ÀüÈ÷ ¹®ÀÚ¿­ÀÇ Ã³À½¿¡ ÀÏÄ¡ÇÏÁö¸¸, ^Àº ¹®ÀÚ¿­ ¾È¿¡¼­ »õÁÙ¹®ÀÚ µÚ¸é ¾î´À À§Ä¡¿¡³ª ÀÏÄ¡Çصµ ÁÁ´Ù.

\Z
¹®ÀÚ¿­ÀÇ ³¡¿¡¸¸ ÀÏÄ¡ÇÑ´Ù.

\b
´Ü¾î °æ°èÀÌ´Ù. ÀÌ´Â 0-³Êºñ ¼±¾ðÀ¸·Î¼­ ´Ü¾îÀÇ Ã³À½À̳ª ³¡¿¡¸¸ ÀÏÄ¡ÇÑ´Ù. ´Ü¾î´Â ¿µ¹®ÀÚ¼ýÀÚ ¹®ÀÚÀÇ ¿¬¼Ó¿­·Î Á¤ÀǵȴÙ, ±×·¡¼­ ´Ü¾îÀÇ ³¡Àº °ø¹éÀ̳ª ºñ-¿µ¹®ÀÚ¼ýÀÚ ¹®ÀÚ·Î ³ªÅ¸³½´Ù.

´ÙÀ½ ¿¹Á¦¿¡¼­´Â ¿ÏÀüÇÑ ´Ü¾îÀÏ ¶§¸¸ "class"°¡ ÀÏÄ¡ÇÑ´Ù; ±× ¾È¿¡ ¶Ç´Ù¸¥ ´Ü¾î°¡ Æ÷ÇԵǾî ÀÖÀ¸¸é ÀÏÄ¡ÇÏÁö ¾Ê´Â´Ù.

>>> p = re.compile(r'\bclass\b')
>>> print p.search('no class at all')
<re.MatchObject instance at 80c8f28>
>>> print p.search('the declassified algorithm')
None
>>> print p.search('one subclass is')
None

ÀÌ·± Ư¼ö ¿¬¼Ó¿­À» »ç¿ëÇÒ ¶§ ¸í½ÉÇؾßÇÒ ¹Ì¹¦ÇÑ ¹®Á¦°¡ µÎ°¡Áö ÀÖ´Ù. ù°, ÆÄÀ̽ãÀÇ ¹®ÀÚ¿­ ±âÈ£¹®ÀÚ¿Í Á¤±Ô Ç¥Çö½ÄÀÇ ¿¬¼Ó¿­ »çÀÌÀÇ ½É°¢ÇÑ Ãæµ¹ÀÌ´Ù. ÆÄÀ̽㠹®ÀÚ¿­ ±âÈ£¹®ÀÚ¿¡¼­, "\b"´Â ¿ª»ç¼± ¹®ÀÚÀ̸ç, ASCII °ªÀÌ 8ÀÌ´Ù. ³¯ ¹®ÀÚ¿­À» »ç¿ëÇÏÁö ¾ÊÀ¸¸é, ÆÄÀ̽ãÀº "\b"¸¦ ¹é½ºÆäÀ̽º·Î º¯È¯ÇÏ°í, RE´Â ¿¹»óµÇ·Î ÀÏÄ¡ÇÏÁö ¾Ê´Â´Ù. ´ÙÀ½ ¿¹Á¦´Â ¾ÕÀÇ RE¿Í ¶È °°¾Æ º¸ÀÌÁö¸¸, RE ¹®ÀÚ¿­ÀÇ ¾Õ¿¡ "r"ÀÌ ºüÁ® ÀÖ´Ù.

>>> p = re.compile('\bclass\b')
>>> print p.search('no class at all')
None
>>> print p.search('\b' + 'class' + '\b')  
<re.MatchObject instance at 80c3ee0>

µÑ°, ÀÌ·± ¼±¾ðÀÌ »ç¿ëµÇÁö ¾Ê´Â ¹®ÀÚ ºÎ·ù ¾È¿¡¼­, \b´Â ÆÄÀ̽ãÀÇ ¹®ÀÚ¿­ ¹®ÀÚ±âÈ£¿ÍÀÇ È£È¯¼ºÀ» À§Çؼ­ ¹é½ºÆäÀ̽º ¹®ÀÚ¸¦ ³ªÅ¸³½´Ù.

\B
¶Ç´Ù¸¥ 0-³Êºñ ¼±¾ðÀÌ´Ù. ÀÌ´Â \bÀÇ ¹Ý´ë·Î¼­, ÇöÀç À§Ä¡°¡ ´Ü¾î °æ°è°¡ ¾Æ´Ò ¶§¸¸ ÀÏÄ¡ÇÑ´Ù.

4.2 ±×·ìÁþ±â

´Ü¼øÈ÷ RE°¡ ÀÏÄ¡Çß´ÂÁöÀÇ ¿©ºÎº¸´Ù ´õ ¸¹Àº Á¤º¸¸¦ ¾ò°í ½ÍÀ» ¶§°¡ ¸¹´Ù. Á¤±Ô Ç¥Çö½ÄÀº RE¸¦ ¿©·¯ ÇϺα׷ìÀ¸·Î Àß¶ó¼­ ¼­·Î ´Ù¸¥ ÇØ´ç ±¸¼º¿ä¼Òµé¿¡ ÀÏÄ¡Çϵµ·Ï ÀÛ¼ºÇÔÀ¸·Î½á ¹®ÀÚ¿­À» ºÐÇÒ Çϴµ¥ ÀÚÁÖ »ç¿ëµÈ´Ù. ¿¹¸¦ µé¾î, RFC-822 ¸Ó¸®ºÎ ÁÙÀº ¸Ó¸®ºÎ À̸§°ú °ªÀ¸·Î ³ª´µ°í, ":"·Î °¥¸°´Ù. ÀÌ´Â Àüü ¸Ó¸®ºÎ ÁÙ¿¡ ÀÏÄ¡ÇÏ´Â Á¤±Ô Ç¥Çö½ÄÀ» ÀÛ¼ºÇϸé ó¸®µÉ ¼ö ÀÖ´Ù. Á¤±Ô Ç¥Çö½Ä¿¡¼­ ÇÑ ±×·ìÀº ¸Ó¸®ºÎ À̸§¿¡ ÀÏÄ¡ÇÏ°í ´Ù¸¥ ±×·ìÀº ¸Ó¸®ºÎÀÇ °ª¿¡ ÀÏÄ¡Çϵµ·Ï ÇÏ¸é µÈ´Ù.

±×·ìÀº "(", ")" ¸ÞŸ¹®ÀڷΠǥ½ÄµÈ´Ù. "(" ±×¸®°í ")"´Â ¼öÇРǥÇö½Ä¿¡¼­ÀÇ ÀÇ¹Ì¿Í °ÅÀÇ °°´Ù; Ç¥Çö½ÄµéÀ» »çÀÌ¿¡ ÇÔ²² ±×·ìÁþ´Â´Ù. ¿¹¸¦ µé¾î, *, +, ?, ¶Ç´Â {m,n}¿Í °°Àº ¹Ýº¹ ¼ö½ÄÀÚ·Î ±×·ìÀÇ ³»¿ëÀ» ¹Ýº¹ÇÒ ¼ö ÀÖ´Ù. (ab)*´Â "ab"ÀÇ ÇϳªÀÌ»óÀÇ ¹Ýº¹°ú ÀÏÄ¡ÇÑ´Ù.

>>> p = re.compile('(ab)*')
>>> print p.match('ababababab').span()
(0, 10)

"(", ")"·Î ³ªÅ¸³½ ±×·ìÀº ÀÏÄ¡ÇÑ ÅؽºÆ®ÀÇ ½ÃÀÛ ÁöÇ¥¿Í ³¡ ÁöÇ¥¸¦ ¾òÀ» ¼ö ÀÖ´Ù; ÀÌ ÁöÇ¥¸¦ ¿­¶÷ÇÏ·Á¸é Àμö¸¦ group(), start(), end(), ±×¸®°í span()¿¡ °Ç³×¸é µÈ´Ù. ±×·ìÀº 0¿¡¼­ºÎÅÍ ¹øÈ£°¡ ¸Å°ÜÁø´Ù. ±×·ì 0¹øÀº ¾ðÁ¦³ª Á¸ÀçÇÑ´Ù; Áï ¿ÂÀüÇÑ Àüü REÀ̸ç, ±×·¡¼­ MatchObject ¸Þ½îµå´Â ¸ðµÎ ±×·ì 0À» ±âº» Àμö·Î °¡Áø´Ù. ³ªÁß¿¡ ÀÏÄ¡ÇÑ ÅؽºÆ®ÀÇ ¹üÀ§¸¦ ³ªÆ÷ÇÏÁö ¾Ê´Â ±×·ìÀ» Ç¥ÇöÇÏ´Â ¹ýÀ» »ìÆì º¸°Ú´Ù.

>>> p = re.compile('(a)b')
>>> m = p.match('ab')
>>> m.group()
'ab'
>>> m.group(0)
'ab'

ÇϺα׷ìÀº ¿ÞÂÊ¿¡¼­ ¿À¸¥ÂÊÀ¸·Î, 1ºÎÅÍ À§·Î ¹øÈ£°¡ ¸Å°ÜÁø´Ù. ±×·ìÀº ³»Æ÷µÉ ¼ö ÀÖ´Ù; ±× ¹øÈ£¸¦ °áÁ¤ÇÏ·Á¸é, ±×³É ¿­¸° °ýÈ£ÀÇ ¹®ÀÚ¸¦ ¿ÞÂÊ¿¡¼­ ¿À¸¥ÂÊÀ¸·Î ¼¼¾î º¸¸é µÈ´Ù.

>>> p = re.compile('(a(b)c)d')
>>> m = p.match('abcd')
>>> m.group(0)
'abcd'
>>> m.group(1)
'abc'
>>> m.group(2)
'b'

group()Àº ¿©·¯ ±×·ì ¹øÈ£¸¦ ÇÑ ¹ø¿¡ °Ç³Ú ¼ö Àִµ¥, ÀÌ·± °æ¿ì ±×·± ±×·ì¿¡ ´ëÇÏ¿© »óÀÀÇÏ´Â °ªµéÀ» ´ãÀº ÅÍÇÃÀ» ¹ÝȯÇÑ´Ù.

  
>>> m.group(2,1,2)
('b', 'abc', 'b')

groups() ¸Þ½îµå´Â 1¿¡¼­ ½ÃÀÛÇÏ¿© ¾ó¸¶³ª ¸¹ÀÌ ÀÖµçÁö ¸ðµç ÇϺα׷ìÀÇ ¹®ÀÚ¿­À» ´ãÀº ÅÍÇÃÀ» ¹ÝȯÇÑ´Ù.

  
>>> m.groups()
('abc', 'b')

ÆÐÅÏ¿¡ ¿ªÂüÁ¶¸¦ »ç¿ëÇϸé ÀÌÀü ³ªÆ÷ ±×·ìÀÇ ³»¿ëÀÌ ¹®ÀÚ¿­ÀÇ ÇöÀç À§Ä¡¿¡¼­µµ ¿ª½Ã ¹ß°ßµÇ¾î¾ß ÇÑ´Ù°í ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î, \1Àº ±×·ì 1ÀÇ Á¤È®ÇÑ ³»¿ëÀÌ ÇöÀç À§Ä¡¿¡¼­ ¹ß°ßµÇ¸é ¼º°øÇÏ°í, ±×·¸Áö ¾ÊÀ¸¸é ½ÇÆÐÇÑ´Ù. ²À ±â¾ïÇØ¾ß ÇÒ °ÍÀº ÆÄÀ̽ãÀÇ ¹®ÀÚ¿­ ±âÈ£¹®Àڵ鵵 ¿ª½Ã ¿ª»ç¼± ´ÙÀ½¿¡ ¼ýÀÚ¸¦ »ç¿ëÇÏ¿© ÀÓÀÇÀÇ ¹®ÀÚµéÀ» ¹®ÀÚ¿­¿¡ Æ÷ÇÔÇϱ⠶§¹®¿¡, RE¿¡ ¿ªÂüÁ¶¸¦ ±¸ÇöÇÒ ¶§´Â ³¯ ¹®ÀÚ¿­À» »ç¿ëÇ϶ó´Â °ÍÀÌ´Ù.

¿¹¸¦ µé¾î, ´ÙÀ½ÀÇ RE´Â ¹®ÀÚ¿­¿¡¼­ Áߺ¹µÇ´Â ´Ü¾î¸¦ ŽÁöÇÑ´Ù.

>>> p = re.compile(r'(\b\w+)\s+\1')
>>> p.search('Paris in the the spring').group()
'the the'

ÀÌ¿Í °°Àº ¿ªÂüÁ¶´Â ¹®ÀÚ¿­À» ±×³É Ž»öÇÒ ¶§´Â º°·Î ¾µ¸ð°¡ ¾ø´Ù -- ÀÌ·± ½ÄÀ¸·Î µ¥ÀÌÅÍ°¡ ¹Ýº¹µÇ´Â ÅؽºÆ® ÇüÅ´ °ÅÀÇ ¾ø´Ù -- ÇÏÁö¸¸ ¹®ÀÚ¿­ ´ëü¸¦ ¼öÇàÇÒ ¶§´Â ¾ÆÁÖ ¾µ¸ð°¡ ÀÖ´Ù´Â °ÍÀ» ¾Ë°Ô µÉ °ÍÀÌ´Ù.

4.3 ºñ-³ªÆ÷ ±×·ì°ú À̸§ºÙÀº ±×·ì

Á¤±³ÇÑ RE¶ó¸é ¸¹Àº ±×·ìÀ» °¡Áú ¼ö ÀÖ°í, °ü½ÉÀ» µÐ ÇϺι®ÀÚ¿­À» ³ªÆ÷ÇÏ°í ¶Ç RE ±× ÀÚü¸¦ ±×·ìÁþ°í ±¸¼ºÇÒ ¼ö ÀÖ´Ù. º¹ÀâÇÑ RE¿¡¼­´Â, ±×·ì ¹øÈ£¸¦ ÃßÀû À¯ÁöÇϱⰡ Èûµé¾îÁø´Ù. ÀÌ ¹®Á¦¸¦ µµ¿ÍÁ٠Ư¡ÀÌ µÎ°¡Áö ÀÖ´Ù. µÎ °¡Áö Ư¡ ¸ðµÎ Á¤±Ô Ç¥Çö½Ä È®Àå¿¡ ´ëÇÏ¿© °øÅëÀÎ ±¸¹®À» »ç¿ëÇϱ⠶§¹®¿¡, ¸ÕÀú ÀÌ°ÍÀ» »ìÆì º¸°Ú´Ù.

ÆÞ 5¿¡´Â Ç¥ÁØ Á¤±Ô Ç¥Çö½Ä¿¡ ¿©·¯ Ư¡µéÀÌ Ãß°¡µÇ¾ú´Ù. ÆÄÀ̽ãÀÇ re ¸ðµâÀº ±×·¸°Ô Ãß°¡µÈ °ÍµéÀ» ´ëºÎºÐ Áö¿øÇÑ´Ù. ÆÞÀÇ Á¤±Ô Ç¥Çö½ÄÀ» Ç¥ÁØ RE¿Í ¾ÆÁÖ ´Ù¸£°Ô ¸¸µéÁö ¾Ê°í¼­, »õ·Î¿î ÇÑ°³Â¥¸® ¸ÞŸ¹®ÀÚ³ª ¶Ç´Â "\"·Î ½ÃÀÛÇÏ´Â »õ·Î¿î Ư¼ö ¿¬¼Ó¿­À» °ñ¶ó¼­ »õ·Î¿î Ư¡À» ³ªÅ¸³»±â´Â ¾î·Á¿üÀ» °ÍÀÌ´Ù. ¿¹¸¦ µé¾î "&"¸¦ »õ·Î¿î ¸ÞŸ¹®ÀÚ·Î °ñ¶ú´Ù¸é, ±¸Çü Ç¥Çö½ÄÀº "&"°¡ Á¤±Ô ¹®ÀÚ¶ó°í °£ÁÖÇÒ °ÍÀÌ°í ÀÌ°ÍÀ» ÇǽŽÃÅ°±â À§ÇÏ¿© \& ¶Ç´Â [&]¸¦ ÀÛ¼ºÇÏ·Á°í´Â ÇÏÁö ¾ÊÀ» °ÍÀÌ´Ù.

ÆÞ °³¹ßÀÚµéÀÌ °í¸¥ ÇØ°áÃ¥Àº (?...)¸¦ È®Àå ±¸¹®À¸·Î »ç¿ëÇÑ °ÍÀ̾ú´Ù. °ýÈ£ ¹Ù·Î ´ÙÀ½¿¡ ³ª¿À´Â "?"´Â ¹Ýº¹ÇÒ °ÍÀÌ ¾øÀ» °ÍÀ̹ǷÎ, ÀÌ·¸°Ô Çؼ­ ȣȯ¼º ¹®Á¦°¡ ¾ß±âµÇÁö ¾Ê¾Ò´Ù. "?" ¹Ù·Î ´ÙÀ½ÀÇ ¹®ÀÚµéÀº ¾î¶² È®ÀåÀÚ°¡ »ç¿ëµÇ°í ÀÖ´ÂÁö¸¦ ³ªÅ¸³»°í, ±×·¡¼­ (±àÁ¤ÀûÀÎ ³»´Ùº¸±â ¼±¾ðÀÎ) (?=foo)°ú (ÇϺΠǥÇö½Ä foo¸¦ ´ã°í ÀÖ´Â ºñ-³ªÆ÷ ±×·ìÀÎ) (?:foo)´Â ´Ù¸£´Ù.

ÆÄÀ̽ãÀº ÆÞÀÇ È®Àå ±¸¹®¿¡ ¶Ç È®Àå ±¸¹®À» Ãß°¡ÇÑ´Ù. ¹°À½ Ç¥ ´ÙÀ½¿¡ ù ¹®ÀÚ°¡ "P"¶ó¸é, ÆÄÀ̽㿡 Á¾¼ÓÀûÀÎ È®ÀåÀÌ´Ù. ÇöÀç·Î´Â ±×·± È®ÀåÀÌ µÎ °¡Áö°¡ ÀÖ´Ù: (?P<name>...)´Â À̸§ºÙÀÎ ±×·ìÀ» Á¤ÀÇÇÑ´Ù. ±×¸®°í (?P=name)´Â À̸§ºÙÀº ±×·ì¿¡ ´ëÇÑ ¿ªÂüÁ¶ÀÌ´Ù(backreference). ¾ÕÀ¸·Î Perl 5ÀÇ ¹Ì·¡ ¹öÀü¿¡¼­ ´Ù¸¥ ±¸¹®À» »ç¿ëÇÏ¿© ºñ½ÁÇÑ Æ¯Â¡ÀÌ Ãß°¡µÈ´Ù¸é, re ¸ðµâÀº ±× »õ·Î¿î ±¸¹®À» Áö¿øÇϱâ À§ÇØ º¯°æµÉ °ÍÀÌ´Ù. ÇÑÆíÀ¸·Î ȣȯ¼ºÀ» À§ÇØ ±× ÆÄÀ̽ã Á¾¼ÓÀûÀÎ ±¸¹®Àº À¯ÁöÇÒ °ÍÀÌ´Ù.

ÀÌÁ¦ ÀϹÝÀûÀÎ È®Àå ±¸¹®À» »ìÆì º¸¾ÒÀ¸¹Ç·Î, º¹ÀâÇÑ RE·Î ±×·ìÀ» ó¸®ÇÏ´Â ÀÛ¾÷À» °£´ÜÈ÷ ÇØÁִ Ư¡À¸·Î µÇµ¹¾Æ°¡ º¸ÀÚ. ±×·ìÀº ¿ÞÂÊ¿¡¼­ ¿À¸¥ÂÊÀ¸·Î ¹øÈ£°¡ ¸Å°ÜÁö°í º¹ÀâÇÑ Ç¥Çö½ÄÀº ¸¹Àº ±×·ìÀ» »ç¿ëÇÒ ¼ö Àֱ⠶§¹®¿¡, ¿Ã¹Ù¸¥ ¹øÈ£¸Å±â±â¸¦ ÃßÀû À¯ÁöÇϱⰡ Á¡Á¡ Èûµé¾îÁø´Ù. ±×·¸°Ô º¹ÀâÇÑ RE¸¦ º¯°æÇÏ´Â ÀÛ¾÷Àº Â¥Áõ³ª´Â ÀÏÀÌ´Ù. ¾ÕºÎºÐ¿¡´Ù »õ·Î¿î ±×·ìÀ» »ðÀÔÇϸé, ±× ´ÙÀ½¿¡ µû¸£´Â ¸ðµç °ÍµéÀÇ ¹øÈ£°¡ º¯°æµÈ´Ù.

¸ÕÀú, ±×·ìÀ» »ç¿ëÇÏ¿© Á¤±Ô Ç¥Çö½ÄÀÇ ºÎºÐÀ» ¸ðÀ¸°í ½ÍÁö¸¸, ±×·ìÀÇ ³»¿ëÀ» ¿­¶÷Çϴµ¥´Â °ü½ÉÀÌ ¾øÀ» ¶§°¡ ÀÚÁÖ ÀÖ´Ù. ÀÌ Àǵµ¸¦ ¸íÈ®ÇÏ°Ô ³ªÅ¸³»°í ½ÍÀ¸¸é ºñ-³ªÆ÷ ±×·ìÀ» »ç¿ëÇÏ¸é µÈ´Ù: (?:...)°¡ ¹Ù·Î ±×°ÍÀε¥, °ýÈ£ ¾È¿¡ ´Ù¸¥ ¾î¶² Á¤±Ô Ç¥Çö½Äµµ ³ÖÀ» ¼ö ÀÖ´Ù.

>>> m = re.match("([abc])+", "abc")
>>> m.groups()
('c',)
>>> m = re.match("(?:[abc])+", "abc")
>>> m.groups()
()

ÀÏÄ¡µÈ ±×·ìµéÀÇ ³»¿ëÀ» ¿­¶÷ÇÒ ¼ö ¾ø´Ù´Â »ç½Ç¸¸ Á¦¿ÜÇϸé, ºñ-³ªÆ÷ ±×·ìÀº Á¤È®ÇÏ°Ô ³ªÆ÷ ±×·ì°ú ¶È °°ÀÌ ÇàÀ§ÇÑ´Ù; ±× ¾È¿¡ ¹«¾ùÀ̵çÁö ³ÖÀ» ¼ö ÀÖ°í, "*"¿Í °°Àº ¹Ýº¹ ¹®ÀÚ·Î ¹Ýº¹ÇÒ ¼ö ÀÖÀ¸¸ç, ±×¸®°í (³ªÆ÷ ±×·ìÀÌµç ºñ-³ªÆ÷ ±×·ìÀÌµç »ó°ü¾øÀÌ) ´Ù¸¥ ±×·ì ¾È¿¡ ³»Æ÷½Ãų ¼ö ÀÖ´Ù. (?:...)°¡ ƯÈ÷ À¯¿ëÇÒ ¶§´Â ±âÁ¸ÀÇ ±×·ìÀ» º¯°æÇÒ ¶§ Àε¥, ¿Ö³ÄÇÏ¸é ´Ù¸¥ ¸ðµç ±×·ìµéÀÌ ¾î¶»°Ô ¹øÈ£°¡ ¸Å°ÜÁ®¾ß ÇÏ´ÂÁö ¹Ù²ÙÁö ¾Ê°í¼­µµ »õ·Î¿î ±×·ìÀ» Ãß°¡ÇÒ ¼ö Àֱ⠶§¹®ÀÌ´Ù. ³ªÆ÷ ±×·ì°ú ºñ ³ªÆ÷ ±×·ì »çÀÌ¿¡ Ž»ö¿¡ À־ÀÇ ¼öÇ༺´ÉÀÇ Â÷ÀÌ´Â ÀüÇô ¾ø´Ù´Â »ç½ÇÀ» ²À ¾ð±ÞÇؾ߰ڴÙ; ÇÑ ÇüÅ°¡ ´Ù¸¥ Çüź¸´Ù ´õ ºü¸£°Å³ª ÇÏÁö´Â ¾Ê´Â´Ù.

µÑ°·Î ´õ Áß¿äÇÑ Æ¯Â¡Àº À̸§ºÙÀº ±×·ìÀÌ´Ù; ¹øÈ£·Î ±×·ìÀ» ÂüÁ¶ÇÏ´Â ´ë½Å¿¡, ±×·ì¿¡ À̸§À» ºÙ¿© ÂüÁ¶ÇÒ ¼ö ÀÖ´Ù.

À̸§ºÙÀº ±×·ìÀ» À§ÇÑ ±¸¹®Àº ÆÄÀ̽ã-Á¾¼ÓÀûÀÎ È®ÀåÀÇ ÇϳªÀÌ´Ù: (?P<name>...)ÀÌ ¹Ù·Î ±×°ÍÀε¥, nameÀÌ ´ç¿¬È÷ ±× ±×·ìÀÇ À̸§ÀÌ´Ù. À̸§À» ±×·ì¿¡ ¿¬°üÁþ´Â´Ù´Â °Í¸¸ Á¦¿ÜÇϸé, À̸§ºÙÀº ±×·ìµµ ¿ª½Ã ³ªÆ÷ ±×·ì°ú µ¿ÀÏÇÏ°Ô ÇàÀ§ÇÑ´Ù. ³ªÆ÷ ±×·ìÀ» ´Ù·ç´Â MatchObject ¸Þ½îµåµéÀº ¸ðµÎ ¹øÈ£·Î ±×·ìÀ» ÂüÁ¶Çϱâ À§ÇÑ Á¤¼ö³ª ¶Ç´Â ±×·ì À̸§À» ´ãÀº ¹®ÀÚ¿­À» ¹Þ´Â´Ù. À̸§ºÙÀº ±×·ìÀº ¿©ÀüÈ÷ ¹øÈ£°¡ ÁÖ¾îÁø´Ù. ±×·¡¼­ µÎ °¡Áö ¹æ½ÄÀ¸·Î ±×·ì¿¡ °üÇÑ Á¤º¸¸¦ ¿­¶÷ÇÒ ¼ö ÀÖ´Ù:

>>> p = re.compile(r'(?P<word>\b\w+\b)')
>>> m = p.search( '(((( Lots of punctuation )))' )
>>> m.group('word')
'Lots'
>>> m.group(1)
'Lots'

À̸§ºÙÀº ±×·ìÀº ¹øÈ£¸¦ ±â¾ïÇϱ⠺¸´Ù ½±°Ô À̸§À» ±â¾ïÇÒ ¼ö Àֱ⠶§¹®¿¡ °£ÆíÇÏ´Ù. ´ÙÀ½Àº imaplib ¸ðµâ¿¡¼­ °¡Á®¿Â ¿¹Á¦ REÀÌ´Ù:

InternalDate = re.compile(r'INTERNALDATE "'
        r'(?P<day>[ 123][0-9])-(?P<mon>[A-Z][a-z][a-z])-'
	r'(?P<year>[0-9][0-9][0-9][0-9])'
        r' (?P<hour>[0-9][0-9]):(?P<min>[0-9][0-9]):(?P<sec>[0-9][0-9])'
        r' (?P<zonen>[-+])(?P<zoneh>[0-9][0-9])(?P<zonem>[0-9][0-9])'
        r'"')

±×·ì 9¹øÀ» ±â¾ïÇؼ­ ¿­¶÷ÇÏ´Â °Íº¸´Ù, È®½ÇÈ÷ ´õ ½±°Ô m.group('zonem') ¿­¶÷ÇÒ ¼ö ÀÖ´Ù.

(...)\1°ú °°Àº Ç¥Çö½Ä¿¡¼­ ¿ªÂüÁ¶¸¦ À§ÇÑ ±¸¹®Àº ±×·ìÀÇ ¹øÈ£¸¦ ÂüÁ¶Çϱ⠶§¹®¿¡, ´ç¿¬È÷ ¹øÈ£ ´ë½Å¿¡ ±×·ì À̸§À» »ç¿ëÇÏ´Â º¯Á¾µéÀÌ ÀÖ´Ù. ÀÌ ¶ÇÇÑ ÆÄÀ̽ã È®ÀåÀÌ´Ù: (?P=name)Àº nameÀ̶ó°í ºÎ¸£´Â ±×·ìÀÇ ³»¿ëÀÌ ÇöÀç À§Ä¡¿¡¼­ ´Ù½Ã ¹ß°ßµÇ¾î¾ß ÇÔÀ» ³ªÅ¸³½´Ù. Áߺ¹µÈ ´Ü¾î¸¦ ã´Â Á¤±Ô Ç¥Çö½ÄÀÎ (\b\w+)\s+\1´Â ´ÙÀ½°ú °°ÀÌ (?P<word>\b\w+)\s+(?P=word) ¾º¿©Áú ¼öµµ ÀÖ´Ù:

>>> p = re.compile(r'(?P<word>\b\w+)\s+(?P=word)')
>>> p.search('Paris in the the spring').group()
'the the'

4.4 ³»´Ùº¸±â ¼±¾ð(Lookahead Assertions)

¶Ç´Ù¸¥ 0-³Êºñ È®ÀÎÀº ³»´Ùº¸±â ¼±¾ðÀÌ´Ù. ³»´Ùº¸±â ¼±¾ðÀº ±àÁ¤ÀûÀÎ ÇüÅÂ¿Í ºÎÁ¤ÀûÀÎ ÇüÅ·Π»ç¿ëÇÒ ¼ö ÀÖÀ¸¸ç ´ÙÀ½°ú °°´Ù:

(?=...)
±àÁ¤ÀûÀÎ ³»´Ùº¸±â ¼±¾ð. ¿©±â¿¡¼­´Â ...·Î ³ªÅ¸³½ ´ã°ÜÁø Á¤±Ô Ç¥Çö½ÄÀÌ ÇöÀç À§Ä¡¿¡¼­ ¼º°øÀûÀ¸·Î ÀÏÄ¡ÇÏ¸é ¼º°øÇÏ°í, ±×·¸Áö ¾ÊÀ¸¸é ½ÇÆÐÇÑ´Ù. ±×·¯³ª, ÀÏ´Ü ´ã°ÜÁø Á¤±Ô Ç¥Çö½ÄÀÌ ½ÃµµµÇ´õ¶óµµ, ÀÏÄ¡ ¿£ÁøÀº ´õ ÀÌ»ó ÁøÇàµÇÁö ¾Ê´Â´Ù; ³ª¸ÓÁö ÆÐÅÏÀÌ ±× È®ÀÎÀÌ ½ÃÀÛµÈ ¹Ù·Î ±× °÷¿¡¼­ ½ÃµµµÈ´Ù.

(?!...)
ºÎÁ¤ÀûÀÎ ³»´Ùº¸±â ¼±¾ð. ÀÌ´Â ±àÁ¤ÀûÀÎ È®ÀÎÀÇ ¹Ý´ëÀÌ´Ù; ´ã°ÜÁø ¹®ÀÚ¿­ÀÌ ¹®ÀÚ¿­ÀÇ ÇöÀç À§Ä¡¿¡¼­ ÀÏÄ¡ÇÏÁö ¾ÊÀ¸¸é ¼º°øÇÑ´Ù.

³»´Ùº¸±â ¼±¾ðÀÌ ¾µ¸ð°¡ ÀÖ´Â »ç·Ê¸¦ º¸¿©ÁÖ´Â ¿¹Á¦¸¦ º¸¸é ÀÌ°ÍÀ» È®½ÇÇÏ°Ô ÀÌÇØÇϴµ¥ µµ¿òÀÌ µÉ °ÍÀÌ´Ù. ÆÄÀÏÀ̸§¿¡ ÀÏÄ¡ÇÏ°í ±× À̸§À» "."À» °¡¸§ÀÚ·Î ÇÏ¿© ±âº» À̸§°ú È®ÀåÀÚ·Î °¡¸£´Â °£´ÜÇÑ ÆÐÅÏÀ» »ý°¢ÇØ º¸ÀÚ. ¿¹¸¦ µé¾î "news.rc"¿¡¼­, "news"´Â ±âº» À̸§ÀÌ°í, "rc"´Â ±× ÆÄÀÏÀ̸§ÀÇ È®ÀåÀÚÀÌ´Ù.

ÀÌ¿¡ ÀÏÄ¡ÇÏ´Â ÆÐÅÏÀº ¾ÆÁÖ °£´ÜÇÏ´Ù:

.*[.].*$

ÁÖ¸ñÇÒ °ÍÀº "."ÀÌ ¸ÞŸ¹®ÀÚÀ̱⠶§¹®¿¡ Ưº°ÇÏ°Ô Ãë±ÞµÇ¾î¾ß ÇÑ´Ù´Â °ÍÀÌ´Ù; ³ª´Â ±× ¹®ÀÚ¸¦ ¹®ÀÚ ºÎ·ù¿¡ ³Ö¾ú´Ù. ¶Ç À̲ø¸®´Â $¿¡ ÁÖ¸ñÇÏÀÚ; ÀÌ°ÍÀ» Ãß°¡ÇÑ ÀÌÀ¯´Â ¹®ÀÚ¿­ÀÇ ³ª¸ÓÁö ¸ðµÎ¸¦ È®ÀåÀÚ¿¡ È®½ÇÈ÷ Æ÷ÇÔ½ÃÄÑ¾ß Çϱ⠶§¹®ÀÌ´Ù. ÀÌ Á¤±Ô Ç¥Çö½ÄÀº "foo.bar"¿Í "autoexec.bat" ¶Ç "sendmail.cf" ±×¸®°í "printers.conf"¿¡ ÀÏÄ¡ÇÑ´Ù.

ÀÌÁ¦, ¹®Á¦¸¦ Á¶±Ý ´õ º¹ÀâÇÏ°Ô ÇØ º¸ÀÚ; È®ÀåÀÚ°¡ "bat"ÀÌ ¾Æ´Ñ ÆÄÀÏÀ̸§¿¡ ÀÏÄ¡½ÃÅ°°í ½ÍÀ¸¸é ¾î¶»°Ô ÇÒ±î? ¾à°£ ¿Ã¹Ù¸£Áö ¸øÇÑ ½Ãµµ¸¦ º¸¸é:

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

À§¿¡¼­ ù ½Ãµµ´Â È®ÀåÀÚÀÇ Ã¹ ¹®ÀÚ°¡ "b"°¡ ¾Æ´Ïµµ·Ï ¿ä±¸ÇÔÀ¸·Î½á "bat"¸¦ Á¦¿ÜÇÏ·Á°í ½ÃµµÇÑ´Ù. ÀÌ´Â À߸øµÈ °ÍÀÌ´Ù. ±× ÀÌÀ¯´Â ÆÐÅÏÀÌ "foo.bar"¿¡µµ ÀÏÄ¡ÇÏÁö ¾Ê±â ¶§¹®ÀÌ´Ù.

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

Ç¥Çö½ÄÀº ´ÙÀ½ »ç·ÊÁßÀÇ Çϳª¿Í ÀÏÄ¡Çϵµ·Ï ¿ä±¸ÇÔÀ¸·Î½á óÀ½ÀÇ ÇØ°áÃ¥À» µ¡´ë·Á°í ½ÃµµÇÏ¸é ´õ ÁöÀúºÐÇØ Áø´Ù: È®ÀåÀÚÀÇ Ã¹ ¹®ÀÚ´Â "b"°¡ ¾Æ´Ï´Ù; µÎ ¹ø° ¹®ÀÚ´Â "a"°¡ ¾Æ´Ï´Ù; ¶Ç´Â ¼¼ ¹ø° ¹®ÀÚ´Â "t"°¡ ¾Æ´Ï´Ù. ÀÌ´Â "foo.bar"¸¦ ¹Þ¾ÆµéÀÌ°í "autoexec.bat"´Â ¹ö¸°´Ù. ÇÏÁö¸¸ ¼¼°³Â¥¸®-±âÈ£ È®ÀåÀÚ¸¦ ¿ä±¸ÇÏ°í "sendmail.cf"°ú °°Àº µÎ °³Â¥¸®-±âÈ£ È®ÀåÀÚ¸¦ °¡Áø ÆÄÀÏÀ̸§Àº ¹Þ¾Æ µéÀÌÁö ¾Ê´Â´Ù. À̸¦ °íÃÄ º¸±â À§Çؼ­ ÆÐÅÏÀ» º¹ÀâÇÏ°Ô ¸¸µé¾î º¸°Ú´Ù.

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

¼¼ ¹ø° ½Ãµµ¿¡¼­,"sendmail.cf"¿Í °°ÀÌ ¼¼ ¹®ÀÚº¸´Ù ´õ ªÀº È®ÀåÀÚ¿Í ÀÏÄ¡Çϵµ·Ï Çϱâ À§ÇØ µÎ ¹ø°¿Í ¼¼ ¹ø° ±âÈ£µéÀ» ¸ðµÎ ¼±ÅÃÀûÀ¸·Î ¸¸µé¾ú´Ù.

ÆÐÅÏÀº ÀÌÁ¦ Á¤¸» º¹ÀâÇØÁ®¼­, Àаí ÀÌÇØÇϱⰡ ¾î·Æ´Ù. ´õ ³ª»Û °ÍÀº, »óȲÀÌ º¯Çؼ­ È®ÀåÀÚ¿¡¼­ "bat"¿Í "exe"¸¦ Á¦¿ÜÇÏ°í ½Í¾îÁö¸é, ÆÐÅÏÀÌ ÈξÀ ´õ º¹ÀâÇØÁö°í È¥¶õ½º·¯¿öÁø´Ù´Â °ÍÀÌ´Ù.

ºÎÁ¤ÀûÀÎ ³»´Ùº¸±â ¼±¾ðÀÌ ÀÌ ¸ðµç °ÍÀ» ´ÜÄ®¿¡ ÇØ°áÇØ ÁØ´Ù:

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

ÀÌ ³»´Ùº¸±â ¼±¾ðÀÇ Àǹ̴Â: ¸¸¾à È®ÀåÀÚ bat°¡ ÀÌ ½ÃÁ¡¿¡¼­ ÀÏÄ¡ÇÏÁö ¾ÊÀ¸¸é, ÆÐÅÏÀÇ ³ª¸ÓÁö¸¦ ½ÃµµÇ϶ó´Â ¶æÀÌ´Ù; ¸¸¾à bat$°¡ ÀÏÄ¡Çϸé, Àüü ÆÐÅÏÀº ½ÇÆÐÇÑ´Ù. µÚ µû¸£´Â $´Â "sample.batch"¿Í °°Àº °ÍÀÌ Çã¿ëµÈ´Ù´Â °ÍÀ» È®ÀÎÇϴµ¥ ÇÊ¿äÇÏ´Ù. È®ÀåÀÚ´Â "bat"·Î ½ÃÀÛÇؾ߸¸ ÇÑ´Ù.

´Ù¸¥ ÆÄÀÏÀ̸§ È®ÀåÀÚ¸¦ Á¦¿ÜÇÏ´Â ÀÏÀº ÀÌÁ¦ ½±´Ù; ±×³É ³»´Ùº¸±â ¼±¾ðÀÇ ¾È¿¡´Ù ´ë¾ÈÀ¸·Î Ãß°¡ÇØ ³Ö±â¸¸ ÇÏ¸é µÈ´Ù. ´ÙÀ½ ÆÐÅÏÀº "bat"³ª "exe"·Î ³¡³ª´Â ÆÄÀÏÀ̸§ È®ÀåÀÚ¸¦ Á¦¿Ü½ÃŲ´Ù:

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

5 ¹®ÀÚ¿­ º¯°æÇϱâ

ÀÌ ½ÃÁ¡±îÁö´Â, Á¤ÀûÀÎ ¹®ÀÚ¿­¿¡ ´ëÇÏ¿© Ž»öÀ» ¼öÇàÇßÀ» »ÓÀÌ´Ù. Á¤±Ô Ç¥Çö½ÄÀº ¶ÇÇÑ ´Ù¾çÇÑ ¹æ¹ýÀ¸·Î, ¹®ÀÚ¿­À» º¯°æÇϴµ¥¿¡µµ »ç¿ëµÈ´Ù. RegexObject ¸Þ½îµå¸¦ »ç¿ëÇÏ¸é µÈ´Ù:

¸Þ½îµå/¼Ó¼º  ¸ñÀû 
split() RE°¡ ÀÏÄ¡ÇÒ ¶§¸¶´Ù ¹®ÀÚ¿­À» °¥¶ó¼­ ¸®½ºÆ®¿¡ ³Ö´Â´Ù
sub() RE°¡ ÀÏÄ¡ÇÏ´Â ¸ðµç ÇϺι®ÀÚ¿­À» ã¾Æ¼­ ´Ù¸¥ ¹®ÀÚ¿­·Î ¹Ù²Û´Ù.
subn() sub()¿Í ¶È °°Àº ÀÏÀ» ÇÏÁö¸¸, »õ·Î¿î ¹®ÀÚ¿­°ú ´ëÄ¡ Ƚ¼ö¸¦ ¹ÝȯÇÑ´Ù

5.1 ¹®ÀÚ¿­ °¡¸£±â

RegexObjectÀÇ split() ¸Þ½îµå´Â RE°¡ ÀÏÄ¡ÇÏ´Â °÷¸¶´Ù ¹®ÀÚ¿­À» °¥¶ó¼­, ±× Á¶°¢µéÀ» ´ãÀº ¸®½ºÆ®¸¦ ¹ÝȯÇÑ´Ù. ¹®ÀÚ¿­ÀÇ split() ¸Þ½îµå¿Í ºñ½ÁÇÏÁö¸¸, °¡¸¦ ¼ö ÀÖ´Â °¡¸§ÀÚ¿¡¼­ ÈξÀ ´õ ¸¹Àº À¶Å뼺À» Á¦°øÇÑ´Ù; split()Àº ¿ÀÁ÷ °ø¹éÀ̳ª °íÁ¤µÈ ¹®ÀÚ¿­·Î °¡¸£±â¸¦ Áö¿øÇÒ »ÓÀÌ´Ù. ¿¹»óÇÏ´Ù½ÃÇÇ, ¸ðµâ ¼öÁØÀÇ re.split() ÇÔ¼öµµ ¿ª½Ã ÀÖ´Ù.

split( string [, maxsplit = 0])
Á¤±Ô Ç¥Çö½ÄÀÇ ÀÏÄ¡¸¦ ±âÁØÀ¸·Î ¹®ÀÚ¿­(string)À» °¡¸¥´Ù. ³ªÆ÷ °ýÈ£°¡ RE¿¡ »ç¿ëµÇ¸é, ±× ³»¿ë¹°µµ ¿ª½Ã °á°ú ¸®½ºÆ®ÀÇ ÀϺκÐÀ¸·Î ¹ÝȯµÈ´Ù. ¸¸¾à maxsplitÀÌ 0ÀÌ ¾Æ´Ï¸é, ÃÖ´ë maxsplit¸¸Å­ °¡¸£±â°¡ ¼öÇàµÈ´Ù.

maxsplit¿¡ °ªÀ» °Ç³×¸é °¡¸£±â Ƚ¼ö¸¦ Á¦ÇÑÇÒ ¼ö ÀÖ´Ù. maxsplitÀÌ 0ÀÌ ¾Æ´Ï¸é, ÃÖ´ëÇÑ maxsplit ¸¸Å­ÀÇ °¡¸£±â°¡ ¼öÇàµÇ°í, ¹®ÀÚ¿­ÀÇ ³ª¸ÓÁö´Â ¸®½ºÆ®ÀÇ ¸¶Áö¸· ¿ä¼Ò·Î ¹ÝȯµÈ´Ù. ´ÙÀ½ ¿¹Á¦¿¡¼­, °¡¸§ÀÚ´Â ºñ-¿µ¹®ÀÚ¼ýÀÚ ¹®ÀÚµéÀÇ ¿¬¼Ó¿­ÀÌ´Ù.

>>> p = re.compile(r'\W+')
>>> p.split('This is a test, short and sweet, of split().')
['This', 'is', 'a', 'test', 'short', 'and', 'sweet', 'of', 'split', '']
>>> p.split('This is a test, short and sweet, of split().', 3)
['This', 'is', 'a', 'test, short and sweet, of split().']

°¡¸§ÀÚ »çÀÌ¿¡ ÀÖ´Â ÅؽºÆ®°¡ ¹«¾ùÀÎÁö¿¡ °ü½ÉÀÌ ÀÖÀ» »Ó¸¸ ¾Æ´Ï¶ó ±× °¡¸§ÀÚ°¡ ¹«¾ùÀÎÁöµµ ¾Ë ÇÊ¿ä°¡ ÀÖÀ» °æ¿ì°¡ ÀÚÁÖ ÀÖ´Ù. ³ªÆ÷ °ýÈ£°¡ RE¿¡ »ç¿ëµÇ¸é, ±× °ªµéµµ ¶ÇÇÑ ¸®½ºÆ®ÀÇ ÀϺκÐÀ¸·Î ¹ÝȯµÈ´Ù. ´ÙÀ½ È£ÃâÀ» ºñ±³ÇØ º¸ÀÚ:

>>> p = re.compile(r'\W+')
>>> p2 = re.compile(r'(\W+)')
>>> p.split('This... is a test.')
['This', 'is', 'a', 'test', '']
>>> p2.split('This... is a test.')
['This', '... ', 'is', ' ', 'a', ' ', 'test', '.', '']

¸ðµâ-¼öÁØÀÇ ÇÔ¼ö re.split()¿¡´Â RE°¡ ù Àμö·Î »ç¿ëµÇµµ·Ï Ãß°¡µÇ¾úÁö¸¸, ´Ù¸¥ °ÍÀº ¶È °°´Ù.

>>> re.split('[\W]+', 'Words, words, words.')
['Words', 'words', 'words', '']
>>> re.split('([\W]+)', 'Words, words, words.')
['Words', ', ', 'words', ', ', 'words', '.', '']
>>> re.split('[\W]+', 'Words, words, words.', 1)
['Words', 'words, words.']

5.2 ã±â¿Í ¹Ù²Ù±â

¶Ç´Ù¸¥ ÀϹÝÀûÀÎ ÀÛ¾÷Àº ÆÐÅÏ¿¡ ÀÏÄ¡ÇÏ´Â ¸ðµç °ÍµéÀ» ¹ß°ßÇؼ­, ´Ù¸¥ ¹®ÀÚ¿­·Î ġȯÇÏ´Â °ÍÀÌ´Ù. sub() ¸Þ½îµå´Â ¹®ÀÚ¿­À̳ª ÇÔ¼öÀÏ ¼ö ÀÖ´Â ±³Ã¼ °ª°ú, ±×¸®°í ó¸®µÉ ¹®ÀÚ¿­À» ÃëÇÑ´Ù.

sub( replacement, string[, count = 0])
¹®ÀÚ¿­(string)¿¡¼­ RE°¡ °¡Àå ¿ÞÂÊ¿¡¼­ ÁßøµÇÁö ¾Ê°Ô ÃâÇöÇÒ ¶§¸¶´Ù ´ëü¹°(replacement)·Î ´ëÄ¡ÇÏ¿© ¾òÀº ¹®ÀÚ¿­À» ¹ÝȯÇÑ´Ù. ÆÐÅÏÀÌ ¹ß°ßµÇÁö ¾ÊÀ¸¸é, ¹®ÀÚ¿­(string)Àº ±×´ë·Î ¹ÝȯµÈ´Ù.

¼±ÅÃÀûÀÎ Àμö count´Â ÆÐÅÏÀÇ ÃâÇöÀÌ ´ëÄ¡µÉ ÃÖ´ë Ƚ¼öÀÌ´Ù; count´Â ºñ-À½¼öÀÇ Á¤¼ö°¡ µÇ¾î¾ß ÇÑ´Ù. ±âº» °ªÀÎ 0Àº ¸ðµç ÃâÇöÀ» ´ëÄ¡ÇÑ´Ù´Â ¶æÀÌ´Ù.

´ÙÀ½Àº sub() ¸Þ½îµå¸¦ »ç¿ëÇÏ´Â °£´ÜÇÑ ¿¹ÀÌ´Ù. »ö±ò À̸§µéÀ» ´Ü¾î "colour"·Î ġȯÇÑ´Ù:

>>> p = re.compile( '(blue|white|red)')
>>> p.sub( 'colour', 'blue socks and red shoes')
'colour socks and colour shoes'
>>> p.sub( 'colour', 'blue socks and red shoes', count=1)
'colour socks and red shoes'

subn() ¸Þ½îµå´Â ¶È °°Àº ÀÏÀ» ÇÏÁö¸¸, »õ·Î¿î ¹®ÀÚ¿­ °ª°ú ¼öÇàµÈ ±³Ã¼ Ƚ¼ö¸¦ ´ãÀº 2-ÅÍÇÃÀ» ¹ÝȯÇÑ´Ù:

>>> p = re.compile( '(blue|white|red)')
>>> p.subn( 'colour', 'blue socks and red shoes')
('colour socks and colour shoes', 2)
>>> p.subn( 'colour', 'no colours at all')
('no colours at all', 0)

ºó ÀÏÄ¡´Â ÀÌÀüÀÇ ÀÏÄ¡¿¡ ¹Ù·Î ¿¬À̾ ÀϾÁö ¾ÊÀ» ¶§¸¸ ±³Ã¼µÈ´Ù.

>>> p = re.compile('x*')
>>> p.sub('-', 'abxd')
'-a-b-d-'

¸¸¾à replacement°¡ ¹®ÀÚ¿­À̸é, ±× ¾È¿¡ ÀÖ´Â ¿ª»ç¼±Àº ¸ðµÎ 󸮵ȴÙ. ´Ù½Ã ¸»ÇØ, "\n"Àº ÇÑ°³ÀÇ »õÁÙ¹®ÀÚ·Î º¯È¯µÇ°í, "\r"Àº ³ª¸£°Ôº¹±Í¹®ÀÚ·Î º¯È¯µÈ´Ù. µîµî. "\j"¿Í °°ÀÌ Àß ¸ð¸£´Â ÇǽŠ¹®ÀÚµéÀº ±×´ë·Î µÐ´Ù. "\6"¿Í °°Àº ¿ªÂüÁ¶´Â RE¿¡¼­ »óÀÀÇÏ´Â ±×·ì¿¡ ÀÏÄ¡µÈ ÇϺι®ÀÚ¿­·Î ±³Ã¼µÈ´Ù. ÀÌ·¸°Ô ÇÏ¸é °á°ú·Î ³ª¿À´Â ´ëü ¹®ÀÚ¿­¿¡ ¿ø·¡ ÅؽºÆ®ÀÇ ÀϺθ¦ Â¥³ÖÀ» ¼ö ÀÖ´Ù.

´ÙÀ½ ¿¹Á¦´Â "{", "}"¿¡ µÑ·¯½ÎÀÎ ¹®ÀÚ¿­ÀÌ ´ÙÀ½¿¡ µû¶ó¿À´Â "section"À̶ó´Â ´Ü¾î¿¡ ÀÏÄ¡Çϸé, "section"À» "subsection"À¸·Î ¹Ù²Û´Ù:

>>> p = re.compile('section{ ( [^}]* ) }', re.VERBOSE)
>>> p.sub(r'subsection{\1}','section{First} section{second}')
'subsection{First} subsection{second}'

(?P<name>...) ±¸¹®À¸·Î Á¤ÀǵǾî À̸§ºÙÀº ±×·ìÀ» ÂüÁ¶Çϴµ¥ »ç¿ëµÇ´Â ±¸¹®µµ ÀÖ´Ù. "\g<name>"Àº "name"À̶ó´Â À̸§ÀÇ ±×·ì¿¡ ÀÏÄ¡µÈ ÇϺι®ÀÚ¿­À» »ç¿ëÇÏ°í, "\g<number>"Àº ±×¿¡ »óÀÀÇÏ´Â ±×·ì ¹øÈ£¸¦ »ç¿ëÇÑ´Ù. ±×·¯¹Ç·Î "\g<2>"´Â "\2"¿Í µ¿µîÇÏÁö¸¸, "\g<2>0"¿Í °°Àº ´ëü ¹®ÀÚ¿­¿¡¼­ ¸í·áÇÏ´Ù. ("\20"´Â ´ÙÀ½¿¡ ±âÈ£¹®ÀÚ "0"ÀÌ µû¶ó¿À´Â ±×·ì 2¹ø¿¡ ´ëÇÑ ÂüÁ¶°¡ ¾Æ´Ï¶ó ±×·ì 20¿¡ ´ëÇÑ ÂüÁ¶·Î ¹ø¿ªµÈ´Ù.) ´ÙÀ½ÀÇ Ä¡È¯Àº ¸ðµÎ µ¿µîÇÏÁö¸¸, ´ëü ¹®ÀÚ¿­ÀÇ ¼¼°¡Áö º¯ÇüÀ» ¸ðµÎ »ç¿ëÇÑ´Ù.

>>> p = re.compile('section{ (?P<name> [^}]* ) }', re.VERBOSE)
>>> p.sub(r'subsection{\1}','section{First}')
'subsection{First}'
>>> p.sub(r'subsection{\g<1>}','section{First}')
'subsection{First}'
>>> p.sub(r'subsection{\g<name>}','section{First}')
'subsection{First}'

replacement´Â ÇÔ¼ö°¡ µÉ ¼öµµ Àִµ¥, ÀÌ°ÍÀÌ ÈξÀ ´õ ÅëÁ¦°¡ °¡´ÉÇÏ´Ù. replacement°¡ ÇÔ¼ö¶ó¸é, ±× ÇÔ¼ö´Â patternÀÌ ÁßøµÇÁö ¾Ê°í ÃâÇöÇÒ ¶§¸¶´Ù È£ÃâµÈ´Ù. °¢ È£Ã⸶´Ù, ±× ÇÔ¼ö¿¡ ±× ÀÏÄ¡¿¡ ´ëÇÑ MatchObject Àμö°¡ °Ç³×Áö°í ÀÌ Á¤º¸¸¦ »ç¿ëÇÏ¿© ¿øÇÏ´Â ´ëü ¹®ÀÚ¿­À» °è»êÇÏ°í ±×°ÍÀ» ¹ÝȯÇÑ´Ù.

´ÙÀ½ ¿¹Á¦¿¡¼­, ±³Ã¼ ÇÔ¼ö´Â ½ÊÁø¼ö¸¦ ½ÊÀ°Áø¼ö·Î ¹ø¿ªÇÑ´Ù:

>>> def hexrepl( match ):
...     "Return the hex string for a decimal number"
...     value = int( match.group() )
...     return hex(value)
...
>>> p = re.compile(r'\d+')
>>> p.sub(hexrepl, 'Call 65490 for printing, 49152 for user code.')
'Call 0xffd2 for printing, 0xc000 for user code.'

¸ðµâ ¼öÁØÀÇ re.sub() ÇÔ¼ö¸¦ »ç¿ëÇÒ ¶§, ÆÐÅÏÀÌ Ã¹ Àμö·Î °Ç³×Áø´Ù. ÆÐÅÏÀº ¹®ÀÚ¿­À̰ųª RegexObjectÀÏ ¼ö ÀÖ´Ù; Á¤±Ô Ç¥Çö½Ä Ç¥½ÄÀ» ÁöÁ¤ÇÒ ÇÊ¿ä°¡ ÀÖÀ¸¸é, RegexObject¸¦ ù Àμö·Î »ç¿ëÇϰųª, ¶Ç´Â ÀÓº£µåµÈ ¼ö½ÄÀÚ¸¦ ÆÐÅÏ¿¡ »ç¿ëÇØ¾ß ÇÑ´Ù. ¿¹¸¦ µé¾î sub("(?i)b+", "x", "bbbb BBBB")´Â 'x x'¸¦ ¹ÝȯÇÑ´Ù.

6 ÀϹÝÀûÀÎ ¹®Á¦µé

Á¤±Ô Ç¥Çö½ÄÀº ¾î¶² °÷¿¡´Â °­·ÂÇÑ µµ±¸ÀÌÁö¸¸, ¾î¶² ¸é¿¡¼­ ±× ÇàÀ§´Â Á÷°üÀûÀÌÁö ¾Ê°í ¶§·Î´Â ¿¹»ó´ë·Î ÇàÀ§ÇÏÁö ¾Ê´Â´Ù. ÀÌ ¼½¼Ç¿¡¼­´Â °¡Àå ÈçÇÏ°Ô ºüÁö´Â ÇÔÁ¤µéÀ» ÁöÀûÇØ º¸°Ú´Ù.

6.1 ¹®ÀÚ¿­ ¸Þ½îµå¸¦ »ç¿ëÇÏÀÚ

¶§·Î´Â re ¸ðµâÀ» »ç¿ëÇÏ´Â °ÍÀÌ ½Ç¼öÀÎ °æ¿ì°¡ ÀÖ´Ù. °íÁ¤µÈ ¹®ÀÚ¿­À» ÀÏÄ¡½ÃÅ°·Á°í Çϰųª, ¶Ç´Â ÇÑ ¹®ÀÚÂ¥¸® ºÎ·ù¸¦ ÀÏÄ¡½ÃÅ°°í ½Í´Ù¸é, ±×¸®°í IGNORECASE Ç¥½Ä°ú °°Àº reÀÇ Æ¯Â¡À» »ç¿ëÇÏ°í ÀÖÁö ¾ÊÀ¸¸é, Á¤±Ô Ç¥Çö½ÄÀÇ ÈûÀÌ ¸ðµÎ ÇÊ¿äÇÏÁö´Â ¾ÊÀ» °ÍÀÌ´Ù. ¹®ÀÚ¿­Àº °íÁ¤µÈ ¹®ÀÚ¿­·Î ¿¬»êÀ» ¼öÇàÇÏ´Â ¿©·¯ ¸Þ½îµåµéÀÌ ÀÖ´Ù. ±×¸®°í º¸Åë ´õ ºü¸£´Ù. ¿Ö³ÄÇÏ¸é ±× ±¸ÇöÀÌ Ä¿´Ù¶õ, ´õ ÀϹÝÀûÀÎ Á¤±Ô Ç¥Çö½Ä ¿£Áø ´ë½Å¿¡ ±× ¸ñÀûÀ¸·Î ÃÖÀûÈ­µÈ ´ÜÀÏÇÑ ÀÛÀº C ȸµ¹ÀÌÀ̱⠶§¹®ÀÌ´Ù.

ÇÑ °¡Áö ¿¹´Â ´ÜÀÏÇÑ °íÁ¤ ¹®ÀÚ¿­À» ´Ù¸¥ ¹®ÀÚ¿­·Î ġȯÇÏ´Â °ÍÀÌ´Ù; ¿¹¸¦ µé¾î, "word"¸¦ "deed"·Î ±³Ã¼ÇÏ°í ½Í´Ù°í ÇÏÀÚ. re.sub()ÀÌ ¹Ù·Î ÀÌ·± ÀÏÀ» À§ÇØ »ç¿ëµÉ ¸¸ÇÑ ÇÔ¼öó·³ º¸ÀÌÁö¸¸ replace() ¸Þ½îµå¸¦ °í·ÁÇÏÀÚ. ÁÖ¸ñÇÒ °ÍÀº replace()´Â ´Ü¾î ¾È¿¡ µéÀº "word"µµ ´ëüÇÑ´Ù. "swordfish"¸¦ "sdeedfish"·Î ¹Ù²ÙÁö¸¸, º»·¡ÀÇ RE wordµµ ¿ª½Ã ±×·² °ÍÀÌ´Ù. (´Ü¾îÀÇ ÀϺο¡ ġȯÀ» ¼öÇàÇÏ´Â °ÍÀ» ÇÇÇÏ·Á¸é, ÆÐÅÏÀº "word" ¾çÂÊ¿¡ ´Ü¾î °æ°è°¡ ÀÖ¾î¾ß Çϱ⠶§¹®¿¡ \bword\b·Î µÇ¾î¾ß ÇÑ´Ù. ÀÌ´Â replaceÀÇ ´É·ÂÀ» ³Ñ¾î¼­´Â ÀÛ¾÷ÀÌ´Ù.)

¶Ç´Ù¸¥ ÈçÇÑ ÀÛ¾÷Àº ¹®ÀÚ¿­¿¡¼­ ÇϳªÀÇ ¹®ÀÚ°¡ ÃâÇöÇÒ ¶§¸¶´Ù Áö¿ì°Å³ª, ±×°ÍÀ» ¶Ç´Ù¸¥ ÇϳªÀÇ ¹®ÀÚ·Î ±³Ã¼ÇÏ´Â °ÍÀÌ´Ù. ÀÌ·± ÀÛ¾÷Àº re.sub('\n', ' ', S)¿Í °°Àº °ÍÀ¸·Î ¼öÇàÇÒ ¼ö ÀÖÁö¸¸, translate()°¡ µÎ ÀÛ¾÷ ¸ðµÎ¸¦ ÇÒ ¼ö ÀÖÀ¸¸ç ´Ù¸¥ ¾î¶² Á¤±Ô Ç¥Çö½Ä ¿¬»êº¸´Ù ´õ ºü¸¦ °ÍÀÌ´Ù.

°£´ÜÈ÷ ¸»ÇØ, re ¸ðµâ¿¡ ÀÇÁ¸Çϱâ Àü¿¡, ¸ÕÀú ¹®Á¦°¡ ´õ ºü¸£°í ´õ °£´ÜÇÑ ¹®ÀÚ¿­ ¸Þ½îµå·Î ÇØ°áµÉ ¼ö ÀÖ´ÂÁö »ý°¢ÇØ º¸ÀÚ.

6.2 match() ´ë search()

match() ÇÔ¼ö´Â ¿ÀÁ÷ RE°¡ ¹®ÀÚ¿­ÀÇ Ã³À½¿¡¼­ ÀÏÄ¡ÇÏ´ÂÁö¸¸ Á¡°ËÇϴµ¥, ¹Ý¸é¿¡ search()´Â ¹®ÀÚ¿­À» µû¶ó°¡¸ç ÀÏÄ¡¸¦ ã´Â´Ù. ÀÌ Â÷À̸¦ ¿°µÎ¿¡ µÎ´Â °ÍÀÌ Áß¿äÇÏ´Ù. match()°¡ ¼º°øÀûÀÎ ÀÏÄ¡¸¦ º¸°íÇÏ¸é ±× À§Ä¡´Â ¾ðÁ¦³ª 0ÀÌ´Ù; ÀÏÄ¡°¡ 0¿¡¼­ ½ÃÀÛµÇÁö ¾ÊÀ¸¸é, match()´Â º¸°íÇÏÁö ¾Ê´Â´Ù.

>>> print re.match('super', 'superstition').span()  
(0, 5)
>>> print re.match('super', 'insuperable')    
None

¹Ý¸é¿¡, search()´Â ¹®ÀÚ¿­À» ÁÖ¿í ¾ÕÀ¸·Î Äf¾î°¡¸ç ÀÚ½ÅÀÌ ¹ß°ßÇÑ Ã¹ ÀÏÄ¡¸¦ º¸°íÇÑ´Ù.

>>> print re.search('super', 'superstition').span()
(0, 5)
>>> print re.search('super', 'insuperable').span()
(2, 7)

°¡²û ±×³É RE ¾Õ¿¡ .*¸¦ Ãß°¡Çؼ­ re.match()¸¦ °è¼Ó »ç¿ëÇÏ°í ½ÍÀº À¯È¤ÀÌ µé¶§°¡ ÀÖ´Ù. ÀÌ·± À¯È¤À» ¶³ÃÄ ¹ö¸®°í ´ë½Å¿¡ re.search()¸¦ »ç¿ëÇÏÀÚ. Á¤±Ô Ç¥Çö½Ä ÄÄÆÄÀÏ·¯´Â ÀÏÄ¡¸¦ ã´Â °úÁ¤ÀÇ ¼Óµµ¸¦ ³ôÀ̱â À§ÇØ RE¿¡ ¸î°¡Áö ºÐ¼®À» ÇÑ´Ù. ±×·± ºÐ¼®Áß¿¡ ÇÑ°¡Áö´Â ÀÏÄ¡Çϴ ù ¹®ÀÚ°¡ ¹«¾ùÀ̾î¾ß ÇÏ´ÂÁö °¡´ÆÇÏ´Â °ÍÀÌ ÀÖ´Ù; ¿¹¸¦ µé¾î, Crow´Â "C"·Î ½ÃÀÛÇÏ´Â ¹®ÀÚ¿­°ú ÀÏÄ¡ÇØ¾ß ÇÑ´Ù. ±× ºÐ¼® ´öºÐ¿¡ ¿£ÁøÀº À绡¸® ¹®ÀÚ¿­À» ÄfÀ¸¸ç ½ÃÀÛ ¹®ÀÚ¸¦ ã°í, "C"°¡ ¹ß°ßµÉ ¶§¸¸ ¿ÏÀüÇÑ ÀÏÄ¡¸¦ ½ÃµµÇÑ´Ù.

.*¸¦ µ¡ºÙÀ̸é ÀÌ·± ÃÖÀûÈ­°¡ ºÒ°¡´ÉÇØÁ®¼­, ¹®ÀÚ¿­ÀÇ ³¡±îÁö Äf¾î¾ß ÇÏ°í ´Ù½Ã µ¹¾Æ¿Í ³ª¸ÓÁö RE¿¡ ´ëÇÏ¿© ÀÏÄ¡¸¦ ã¾Æ¾ß ÇÑ´Ù. ´ë½Å¿¡ re.search()¸¦ »ç¿ëÇÏÀÚ.

6.3 Ž¿åÀû Ž»ö ´ë ºñ-Ž¿åÀû Ž»ö

a*¿¡¼­¿Í °°ÀÌ Á¤±Ô Ç¥Çö½ÄÀ» ¹Ýº¹ÇÒ ¶§, °á°ú ÇàÀ§´Â °¡´ÉÇÏ¸é ¸¹Àº ÆÐÅÏÀ» ¼ÒºñÇÏ´Â °ÍÀÌ´Ù. ÀÌ »ç½ÇÀº HTML ÅÂ±× ÁÖÀ§ÀÇ °¢ °ýÈ£¿Í °°Àº ÇѦÀ» ÀÌ·é ±¸ºÐÀÚ¸¦ ÀÏÄ¡ÇÏ·Á°í ½ÃµµÇÒ ¶§ ÀÚÁÖ ¹®´Ù. ÇÑ°³ÀÇ HTML ű׿¡ ÀÏÄ¡½ÃÅ°´Â ¼ø¼öÇÑ ÆÐÅÏÀº .*ÀÇ Å½¿åÀûÀÎ º»¼º ¶§¹®¿¡ ÀÛµ¿ÇÏÁö ¾Ê´Â´Ù.

>>> s = '<html><head><title>Title</title>'
>>> len(s)
32
>>> print re.match('<.*>', s).span()
(0, 32)
>>> print re.match('<.*>', s).group()
<html><head><title>Title</title>

RE´Â "<html>" ¾È¿¡¼­ "<"¿¡ ÀÏÄ¡ÇÏ°í, .*´Â ³ª¸ÓÁö ¹®ÀÚ¿­À» ¼ÒºñÇÑ´Ù. ±×·¸Áö¸¸, ¿©ÀüÈ÷ RE¿¡´Â ´õ ³²¾ÆÀÖ°í, >´Â ¹®ÀÚ¿­ÀÇ ¸¶Áö¸·¿¡ ÀÏÄ¡ÇÒ ¼ö ¾ø±â ¶§¹®¿¡, Á¤±Ô Ç¥Çö½Ä ¿£ÁøÀº >¿¡ ´ëÇÏ¿© ÀÏÄ¡¸¦ ¹ß°ßÇÒ ¶§±îÁö ¹®ÀÚ¸¦ ÇϳªÇϳª ¿ªÃßÀûÇÑ´Ù. ÃÖÁ¾ÀûÀÎ ÀÏÄ¡´Â "<html>"¿¡ ÀÖ´Â "<"¿¡¼­ºÎÅÍ "</title>"¿¡ ÀÖ´Â ">"¿¡±îÁö È®ÀåµÇ´Âµ¥, ÀÌ´Â ¿øÇÏ´Â ¹Ù°¡ ¾Æ´Ï´Ù.

ÀÌ °æ¿ì, ÇØ°áÃ¥Àº ºñ-Ž¿åÀû ¼ö½ÄÀÚ¸¦ »ç¿ëÇÏ´Â °ÍÀÌ´Ù. ¿©±â¿¡´Â *?, +?, ??, ¶Ç´Â {m,n}?ÀÌ Àִµ¥, ÀÌ´Â °¡´ÉÇϸé Àû°Ô ÅؽºÆ®¿Í ÀÏÄ¡ÇÑ´Ù. À§ÀÇ ¿¹Á¦¿¡¼­, ">"´Â ù "<" ÀÏÄ¡ ´ÙÀ½¿¡ ¹Ù·Î ½ÃµµµÇ´Âµ¥, ±×¸®°í ½ÇÆÐÇϸé, ¿£ÁøÀº ÇÑ ¹ø¿¡ ÇÑ ¹®ÀÚ¾¿ ¾ÕÀ¸·Î ³ª¾Æ°¡¸é¼­ °¢ ´Ü°è¸¶´Ù ">"¸¦ ½ÃµµÇÑ´Ù. ÀÌ·¸°Ô ÇÏ¸é ¿Ã¹Ù¸¥ °á°ú¸¦ ¾ò´Â´Ù:

>>> print re.match('<.*?>', s).group()
<html>

(ÁÖ¸ñÇÒ °ÍÀº HTMLÀ̳ª XMLÀ» Á¤±Ô Ç¥Çö½ÄÀ¸·Î Çؼ®ÇÏ´Â ÀÛ¾÷Àº °íÅ뽺·´´Ù´Â °ÍÀÌ´Ù. ¼ø°£-´ëÃæ ¸¸µç ÆÐÅÏÀÌ ÀϹÝÀûÀÎ »ç·ÊµéÀº ó¸®ÇÏ°ÚÁö¸¸, HTML°ú XMLÀº Ưº°ÇÑ »ç·Ê¶ó¼­ È®½ÇÇÑ Á¤±Ô Ç¥Çö½Äµµ ¸Á°¡Æ®¸°´Ù; °¡´ÉÇÑ ¸ðµç »ç·ÊµéÀ» ´Ù·ê ¸¸ÇÑ Á¤±Ô Ç¥Çö½ÄÀ» ¿Ï¼ºÇÒ ¶§ ÂëÀ̸é, ±× ÆÐÅÏÀº ¾ÆÁÖ º¹ÀâÇØÁú °ÍÀÌ´Ù. ±×·± ÀÛ¾÷¿¡´Â HTMLÀ̳ª XML Çؼ®±â¸¦ ÀÌ¿ëÇÏÀÚ.)

6.4 re.VERBOSE¸¦ »ç¿ëÇÏÁö ¾ÊÀ¸¸é

Áö±Ý±îÁö ¾î¼¸é Á¤±Ô Ç¥Çö½ÄÀÌ ¾ÆÁÖ °£°áÇÑ Ç¥±â¹ýÀÏ ¼ö ÀÖÁö¸¸, ÀбⰡ ¾ÆÁÖ ¾î·Æ´Ù´Â °ÍÀ» ´«Ä¡Ã«À» ¼öµµ ÀÖ°Ú´Ù. Àû´çÇÏ°Ô º¹ÀâÇÑ RE´Â ¿ª»ç¼±, °ýÈ£, ±×¸®°í ¸ÞŸ¹®ÀÚÀÇ ±â´Ù¶õ Áý´ÜÀÌ µÉ ¼ö À־, Àаí ÀÌÇØÇϱ⿡ ¾ÆÁÖ ¾î·Æ°Ô µÈ´Ù.

±×·± RE¿¡ ´ëÇؼ­, Á¤±Ô Ç¥Çö½ÄÀ» ÄÄÆÄÀÏ ÇÒ ¶§ re.VERBOSE Ç¥½ÄÀ» ÁöÁ¤Çϸé Á¤±Ô Ç¥Çö½ÄÀ» º¸´Ù ¸í·áÇÏ°Ô Çü½ÄÈ­ÇÒ ¼ö Àֱ⠶§¹® ¿¡ µµ¿òÀÌ µÉ ¼ö ÀÖ´Ù.

re.VERBOSE Ç¥½ÄÀº ¿©·¯°¡Áö È¿°ú°¡ ÀÖ´Ù. Á¤±Ô Ç¥Çö½Ä¿¡¼­ ¹®ÀÚ ¹üÁÖ ¾È¿¡ µé¾î ÀÖÁö ¾ÊÀº °ø¹éÀº ¹«½ÃµÈ´Ù. ÀÌ´Â °ð dog | cat°ú °°Àº Ç¥Çö½ÄÀÌ Á» Àб⿡ ÇÇ°ïÇÑ dog|cat°ú µ¿µîÇÏÁö¸¸, [a b]´Â ¿©ÀüÈ÷ ¹®ÀÚ "a", "b", ¶Ç´Â ½ºÆäÀ̽º¿¡ ÀÏÄ¡ÇÒ °ÍÀ̶ó´Â ¶æÀÌ´Ù. °Ô´Ù°¡, RE ¾È¿¡ ÁÖ¼®µµ ´Þ ¼ö ÀÖ´Ù; ÁÖ¼®Àº "#" ¹®ÀÚ·Î ½ÃÀÛÇÏ¿© ´ÙÀ½ÀÇ »õÁÙ¹®ÀÚ±îÁö È®ÀåµÈ´Ù. »ïÁß-µû¿ÈÇ¥ ¹®ÀÚ¿­°ú ÇÔ²² »ç¿ëÇϸé, º¸´Ù ±ò²ûÇÏ°Ô REÀÇ ¸ð½ÀÀ» ´ÙµëÀ» ¼ö ÀÖ´Ù:

pat = re.compile(r"""
 \s*                 # ¾ÕÀÇ °ø¹éÀ» °Ç³Ê¶Ú´Ù
 (?P<header>[^:]+)   # ¸Ó¸®ºÎ À̸§
 \s* :               # °ø¹é, ±×¸®°í ½ÖÁ¡
 (?P<value>.*?)      # ¸Ó¸®ºÎÀÇ °ª -- *? 
                     # ´ÙÀ½¿¡ µû¸£´Â °ø¹éÀ» ¾ø¾Ö´Âµ¥ »ç¿ëµÈ´Ù
 \s*$                # ÁÙ³¡±îÁö À̲ø¸®´Â °ø¹é
""", re.VERBOSE)

ÀÌ°ÍÀÌ ´ÙÀ½º¸´Ù ÈξÀ ´õ Àб⠽±´Ù:

pat = re.compile(r"\s*(?P<header>[^:]+)\s*:(?P<value>.*?)\s*$")

7 µÇ¸ÔÀÓ

Á¤±Ô Ç¥Çö½ÄÀº º¹ÀâÇÑ ÁÖÁ¦ÀÌ´Ù. ÀÌ ¹®¼­°¡ ÀÌÇØÇϴµ¥ µµ¿òÀÌ µÇ¾ú´ÂÁö ¸ð¸£°Ú´Ù. ÀÌÇØ°¡ ¾È°¡´Â ºÎºÐÀÌ Àְųª ¿©±â¿¡¼­ ´Ù·çÁö ¾ÊÀº ¹®Á¦°¡ ÀÖ´Ù¸é, º»Àο¡°Ô °³¼±À» À§ÇÑ Á¦¾ÈÀ» º¸³»Áֱ⸦ ¹Ù¶õ´Ù.

Á¤±Ô Ç¥Çö½Ä¿¡ °üÇÑ °¡Àå ¿Ïº®ÇÑ Ã¥Àº ¿À¶óÀϸ®(O'Reilly)¿¡¼­ ¹ß°£ÇÑ Á¦ÇÁ¸® ÇÁ¸®µé(Jeffrey Friedl)ÀÇ Á¤±Ô Ç¥Çö½Ä Á¤º¹(Mastering Regular Expressions)ÀÏ °ÍÀÌ´Ù. ºÒÇàÇÏ°Ôµµ, °ÅÀÇ ÆÞ°ú ÀÚ¹Ù ÃëÇâÀÇ Á¤±Ô Ç¥Çö½Ä¿¡ ÁýÁßÇÒ »Ó ÆÄÀ̽㿡 °üÇؼ­´Â ÀüÇô ´Ù·çÁö ¾Ê´Â´Ù. ±×·¡¼­ ÆÄÀ̽ãÀ¸·Î ÇÁ·Î±×·¡¹ÖÇϴµ¥ ÂüÁ¶Çϱ⿡´Â º°·Î ¾µ¸ð°¡ ¾øÀ» °ÍÀÌ´Ù. (ù ÆÇÀº ÆÄÀ̽㿡¼­ ÀÌÁ¦ Æó±âµÈ regex ¸ðµâÀ» ´Ù·ç¾ú°í, ÀÌ´Â º°·Î µµ¿òÀÌ µÇÁö ¸øÇÒ °ÍÀÌ´Ù.)

ÀÌ ¹®¼­¿¡ ´ëÇÏ¿© ...

Á¤±Ô Ç¥Çö½Ä HOWTO

ÀÌ ¹®¼­´Â LaTeX2HTML ¹ø¿ª±â¸¦ »ç¿ëÇÏ¿© ¸¸µé¾îÁ³´Ù.

LaTeX2HTMLÀº ´ÙÀ½¿¡ º¹»ç±ÇÀÌ ÀÖ´Ù: Copyright © 1993, 1994, 1995, 1996, 1997, Nikos Drakos, Computer Based Learning Unit, University of Leeds, and Copyright © 1997, 1998, Ross Moore, Mathematics Department, Macquarie University, Sydney.

LaTeX2HTMLÀ» ÆÄÀ̽㠹®¼­È­¿¡ Àû¿ëÇϸ鼭 ÇÁ·¹µå µå·¹ÀÌÅ©(Fred L. Drake, Jr)°¡ »ó´çÈ÷ ¼ÕÀ» º¸¾Ò´Ù. ¿ø·¡ÀÇ Ç×ÇØ ¾ÆÀÌÄÜÀº Å©¸®½ºÅäÆÛ ÆäÆ®¸±¸®(Christopher Petrilli)°¡ °øÇåÇÏ¿´´Ù.


Release 0.05.