ÄíŬ¸µ(A.M. Kuchling)
amk@amk.ca
ÇѱÛÆÇ johnsonj 2003.11.25
ÀÌ ¹®¼´Â http://www.amk.ca/python/howto¿¡¼ ¾òÀ» ¼ö ÀÖ´Ù.
re ¸ðµâÀÌ ÆÄÀ̽ã 1.5¿¡ Ãß°¡µÇ¾î, ÆÞ-½ºÅ¸ÀÏÀÇ Á¤±Ô Ç¥Çö½Ä ÆÐÅÏÀ» Á¦°øÇÑ´Ù. ÀÌÀü ¹öÀüÀÇ ÆÄÀ̽㿡¼´Â regex ¸ðµâÀÌ µû¶ó¿Ô´Âµ¥, ÀÌ´Â À̸ƽº-½ºÅ¸ÀÏÀÇ ÆÐÅÏÀ» Á¦°øÇÑ´Ù. À̸ƽº-½ºÅ¸ÀÏÀÇ ÆÐÅÏÀº ¾à°£ ÀбⰡ ´õ ¾î·Æ°í ±×·¸°Ô ¸¹Àº Ư¡À» Á¦°øÇÏÁö ¾ÊÀ¸¹Ç·Î, »õ·Î¿î Äڵ带 ÀÛ¼ºÇÒ ¶§ regex ¸ðµâÀ» »ç¿ëÇØ¾ß ÇÒ ÀÌÀ¯°¡ º°·Î ¾ø´Ù. ºñ·Ï ¿¹Àü Äڵ忡¼´Â »ç¿ëÇÏ´Â °ÍÀ» ¸¶ÁÖÇÒ ¼öµµ ÀÖ°ÚÁö¸¸ ¸»ÀÌ´Ù.
Á¤±Ô Ç¥Çö½Ä(RE)Àº º»ÁúÀûÀ¸·Î, ÀÛ°í °íµµ·Î Àü¹®ÈµÈ ÇÁ·Î±×·¡¹Ö ¾ð¾î·Î¼ ÆÄÀ̽㿡 ÀÓº£µå µÇ¾î¼ re ¸ðµâÀ» ÅëÇÏ¿© »ç¿ëÇÒ ¼ö ÀÖ´Ù. ÀÌ ÀÛÀº ¾ð¾î¸¦ »ç¿ëÇϸé, ÀÏÄ¡½ÃÅ°°í ½ÍÀº ¹®ÀÚ¿ ÁýÇÕ¿¡ ´ëÇÏ¿© ±ÔÄ¢À» ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù; ÀÌ ÁýÇÕ¿¡´Â ¿µ¾î ¹®ÀåÀ̳ª, ÀüÀÚ¿ìÆí ÁÖ¼Ò, ¶Ç´Â TeX ¸í·É¾î, ¿øÇÏ´Â ¹«¾ùÀ̵ç Æ÷ÇԵȴÙ. ±×·¯¸é ÀÌ·¸°Ô Áú¹®ÇÒ ¼ö ÀÖ´Ù ``ÀÌ ¹®ÀÚ¿ÀÌ ÆÐÅÏ¿¡ ÀÏÄ¡Çϴ°¡?'', ¶Ç´Â ``ÀÌ ¹®ÀÚ¿¿¡¼ ÆÐÅÏ¿¡ ÀÏÄ¡ÇÏ´Â °ÍÀÌ Àִ°¡?''. RE¸¦ »ç¿ëÇÏ¸é ¶ÇÇÑ ¹®ÀÚ¿À» º¯°æÇϰųª ¿©·¯°¡Áö ¹æ½ÄÀ¸·Î °¡¸¦ ¼ö ÀÖ´Ù.
Á¤±Ô Ç¥Çö½Ä ÆÐÅÏÀº ÀÏ·ÃÀÇ ¹ÙÀÌÆ®ÄÚµå·Î ÄÄÆÄÀϵǰí C·Î ÀÛ¼ºµÈ ÀÏÄ¡ ¿£Áø¿¡ ÀÇÇؼ ½ÇÇàµÈ´Ù. ¼öÁسô°Ô »ç¿ëÇÏ·Á¸é, ÀÌ ¿£ÁøÀÌ ¾î¶»°Ô ÁÖ¾îÁø RE¸¦ ½ÇÇàÇÏ´ÂÁö ÁÖÀǸ¦ ±â¿ï¿©¼, ´õ »¡¸® ½ÇÇàµÇ´Â ¹ÙÀÌÆ®Äڵ带 »ý»êÇϵµ·Ï RE¸¦ ÀÛ¼ºÇÒ ÇÊ¿ä°¡ ÀÖ´Ù. ÃÖÀûÈ´Â ÀÌ ÀÏÄ¡ ¿£ÁøÀÇ ³»ºÎ¿¡ ´ëÇؼ Àß ¾Ë°í ÀÖ¾î¾ß ÇÒ ÇÊ¿ä°¡ Àֱ⠶§¹®¿¡ ÀÌ ¹®¼¿¡¼ ´Ù·çÁö ¾Ê´Â´Ù.
Á¤±Ô Ç¥Çö½Ä ¾ð¾î´Â »ó´ëÀûÀ¸·Î ÀÛ°í Á¦ÇÑÀûÀÌ´Ù. ±×·¡¼ Á¤±Ô Ç¥Çö½ÄÀ» »ç¿ëÇÑ´Ù°í ÇÏ´õ¶óµµ ¸ðµç ¹®ÀÚ¿ ÀÛ¾÷ÀÌ °¡´ÉÇÑ °ÍÀº ¾Æ´Ï´Ù. ¶Ç Á¤±Ô Ç¥Çö½ÄÀ¸·Î 󸮰¡ °¡´ÉÇÏÁö¸¸, ±× Ç¥Çö½ÄÀÌ ³Ê¹«³ªµµ º¹ÀâÇÑ ÀÛ¾÷µµ ÀÖ´Ù. ÀÌ·± °æ¿ì, ÆÄÀ̽ã Äڵ带 ÀÛ¼ºÇؼ 󸮸¦ ÇÏ´Â °ÍÀÌ ´õ ÁÁ´Ù; Á¤±³ÇÑ Á¤±Ô Ç¥Çö½Äº¸´Ù ÆÄÀ̽ã Äڵ尡 ´À¸®°ÚÁö¸¸, ¾Æ¸¶µµ ´õ ÀÌÇØ°¡ ½¬¿ï °ÍÀÌ´Ù.
¸ÕÀú °¡Àå °£´ÜÇÑ Á¤±Ô Ç¥Çö½ÄÀ» ¹è¿öº¸ÀÚ. Á¤±Ô Ç¥Çö½ÄÀº ¹®ÀÚ¿ 󸮿¡ »ç¿ëµÇ±â ¶§¹®¿¡, °¡Àå ÀϹÝÀûÀÎ ÀÛ¾÷ºÎÅÍ ½ÃÀÛÇÏÀÚ: ¹®ÀÚ¿À» ÀÏÄ¡½ÃÄÑ º¸ÀÚ.
Á¤±Ô Ç¥Çö½Ä ¾Æ·¡¿¡ ¼û°ÜÁø ´õ ÀÚ¼¼ÇÑ ÄÄÇ»ÅÍ °øÇÐÀû ¼³¸íÀÌ (°áÁ¤ ±×¸®°í ºñ-°áÁ¤ À¯ÇÑ ¿ÀÅ丶Ÿ) ÇÊ¿äÇϸé, ÄÄÆÄÀÏ·¯ÀÇ ÀÛ¼º¿¡ °üÇÑ ±³°ú¼¸¦ ¾Æ¹«°Å³ª Çϳª ÂüÁ¶ÇÏÀÚ.
´ëºÎºÐÀÇ ¹®ÀÚ¿Í ±âÈ£´Â ±×³É ÀÚ½ÅÀ» ÀÏÄ¡½ÃŲ´Ù. ¿¹¸¦ µé¾î, Á¤±Ô Ç¥Çö½Ä test´Â ¹®ÀÚ¿ "test"¿¡ Á¤È®ÇÏ°Ô ÀÏÄ¡ÇÑ´Ù. (´ë¼Ò¹®ÀÚ-±¸ºÐ ¸ðµå¸¦ È°¼ºÈÇϸé ÀÌ RE¸¦ "Test"³ª "TEST"¿¡µµ ÀÏÄ¡½Ãų ¼ö ÀÖ´Ù; ÀÌ¿¡ °üÇؼ´Â ³ªÁß¿¡ ´õ ÀÚ¼¼È÷ ´Ù·é´Ù.)
ÀÌ ±ÔÄ¢¿¡´Â ¿¹¿Ü°¡ ¸î°¡Áö ÀÖ´Ù; ¾î¶² ¹®ÀÚµéÀº Ưº°Çؼ, ÀڽŰú ÀÏÄ¡ÇÏÁö ¾Ê´Â´Ù. ´ë½Å¿¡, ±×·± ¹®ÀÚµéÀº ¹«¾ð°¡ Á¤»óÀ» ¹þ¾î³ ¾î¶² °ÍµéÀÌ ÀÏÄ¡ÇØ¾ß ÇÑ´Ù´Â °ÍÀ» ³ªÅ¸³»°Å³ª, ¶Ç´Â ¹Ýº¹ÇÔÀ¸·Î½á REÀÇ ´Ù¸¥ ºÎºÐ¿¡ ¿µÇâÀ» ¹ÌÄ£´Ù. ÀÌ ¹®¼ÀÇ ´ëºÎºÐÀº ´Ù¾çÇÑ ¸ÞŸ¹®ÀÚµé°ú ±× ¹®ÀÚµéÀÌ ÇÏ´Â ¿ªÇÒÀ» ³íÀÇÇÑ´Ù.
´ÙÀ½Àº ¸ÞŸ¹®ÀÚÀÇ ¿Ïº®ÇÑ ¸ñ·ÏÀÌ´Ù; ±× Àǹ̸¦ Áö±ÝºÎÅÍ ´Ù·ç¾î º¸°Ú´Ù.
. ^ $ * + ? { [ ] \ | ( )
»ìÆì º¼ ù ¹ø° ¸ÞŸ¹®ÀÚ´Â "[" ±×¸®°í "]"ÀÌ´Ù. ÀÌ ¸ÞŸ¹®ÀÚ´Â ¹®ÀÚ ºÎ·ù¸¦ ÁöÁ¤Çϴµ¥ »ç¿ëµÇ´Âµ¥, ¹®ÀÚ ºÎ·ù¶õ ÀÏÄ¡½ÃÅ°°í ½ÍÀº ¹®ÀÚ ÁýÇÕÀÌ´Ù. ¹®ÀÚµéÀº µû·Îµû·Î ³ª¿µÉ ¼ö ÀÖ´Ù. ¶Ç´Â ÀÏÁ¤ ¹üÀ§ÀÇ ¹®ÀÚµéÀ» ³ªÅ¸³»·Á¸é ¹®ÀÚ µÎ °³¸¦ ÁÖ°í ±× »çÀ̸¦ "-"·Î °¡¸£¸é µÈ´Ù. ¿¹¸¦ µé¸é, [abc]´Â ´ÙÀ½ "a", "b", ¶Ç´Â "c" ¾î´À ¹®Àڿ͵µ ÀÏÄ¡ÇÑ´Ù; ÀÌ´Â [a-c]°ú µ¿ÀÏÇϸç, ¹üÀ§¸¦ »ç¿ëÇؼ °°Àº ¹®ÀÚ ÁýÇÕÀ» Ç¥ÇöÇÑ´Ù. ¿ÀÁ÷ ¼Ò¹®Àڿ͸¸ ÀÏÄ¡½ÃÅ°°í ½ÍÀ¸¸é, RE´Â [a-z]¿Í °°ÀÌ µÈ´Ù.
¸ÞŸ¹®ÀÚ´Â ºÎ·ù¾È¿¡¼´Â ÀÛ¿ëÇÏÁö ¾Ê´Â´Ù. ¿¹¸¦ µé¾î, [akm$]´Â "a", "k", "m", ¶Ç´Â "$"ÀÇ ¾î´À ¹®Àڿ͵µ ÀÏÄ¡ÇÑ´Ù; ÀϹÝÀûÀ¸·Î "$"´Â ¸ÞŸ¹®ÀÚÀÌÁö¸¸, ¹®ÀÚ ºÎ·ù ¾È¿¡¼´Â ±× Ưº°ÇÑ º»¼ºÀ» ÀҴ´Ù.
¿©ÁýÇÕÀ» ÁöÁ¤Çؼ ¹üÀ§ ¾È¿¡ ¾ø´Â ¹®ÀÚ¿¡µµ ÀÏÄ¡½Ãų ¼ö ÀÖ´Ù. ÀÌ´Â ºÎ·ù¿¡¼ ù ¹®ÀÚ·Î "^"¸¦ Æ÷ÇÔÇÏ¿© ³ªÅ¸³½´Ù; ´Ù¸¥ À§Ä¡¿¡¼ "^"°¡ ³ªÅ¸³ª¸é ±×³É "^" ¹®ÀÚ¿¡ ÀÏÄ¡µÈ´Ù. ¿¹¸¦ µé¾î, [^5]
´Â "5"¸¦ Á¦¿ÜÇÏ°í ¾î¶² ¹®ÀÚ¿¡µµ ÀÏÄ¡ÇÑ´Ù.
¾Æ¸¶µµ °¡Àå Áß¿äÇÑ ¸ÞŸ¹®ÀÚ´Â ¿ª»ç¼± "\"ÀÏ °ÍÀÌ´Ù. ÆÄÀ̽㠱âÈ£¹®ÀÚ¿¡¼ ¿ª»ç¼± µÚ¿¡ ´Ù¾çÇÑ ¹®ÀÚµéÀÌ µû¸£¸é¼ ´Ù¾çÇÑ Æ¯¼ö ¿¬¼Ó¿À» ³ªÅ¸³¾ ¼ö ÀÖ´Ù. ¶Ç´Â ¸ðµç ¸ÞŸ¹®ÀÚµéÀ» ÇǽýÃÅ°´Âµ¥¿¡µµ »ç¿ëµÇ¹Ç·Î ¿©ÀüÈ÷ ÆÐÅÏÀ¸·Î ÀÏÄ¡½Ãų ¼ö ÀÖ´Ù; ¿¹¸¦ µé¾î, "[" ¶Ç´Â "\"¸¦ ÀÏÄ¡½ÃÅ°°í ½ÍÀ¸¸é, ¾Õ¿¡ ¿ª»ç¼±À» ¸ÕÀú µÎ¾î¼ ±×ÀÇ Æ¯º°ÇÑ Àǹ̸¦ ¾ø¾Ù ¼ö ÀÖ´Ù: \[ ¶Ç´Â \\.
Ư¼ö ¿¬¼Ó¿Áß¿¡ "\"·Î ½ÃÀÛÇÏ´Â ¿¬¼Ó¿Àº ÀÚÁÖ ¾µ¸ð°¡ ÀÖ´Â ¹®ÀÚµéÀÌ ¹Ì¸®Á¤ÀÇµÈ ÁýÇÕÀ» ³ªÅ¸³»´Âµ¥, ¼ýÀÚ¹®ÀÚ, ±âÈ£ ÁýÇÕ, ¶Ç´Â °ø¹éÀÌ ¾Æ´Ñ ¾î¶² °ÍÀ̵çÁö µÈ´Ù. ´ÙÀ½°ú °°ÀÌ ¹Ì¸® Á¤ÀÇµÈ Æ¯¼ö ¿¬¼Ó¿À» »ç¿ëÇÒ ¼ö ÀÖ´Ù:
\d
\D
[^0-9]
.
\s
\S
[^ \t\n\r\f\v]
.
\w
\W
[^a-zA-Z0-9_]
. ÀÌ·± ¿¬¼Ó¿Àº ¹®ÀÚ ºÎ·ù¾È¿¡ Æ÷Ç﵃ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î, [\s,.]´Â ¾î¶² °ø¹é ¹®ÀÚ¿¡µµ ÀÏÄ¡ÇÏ°í, ¶Ç´Â ","³ª "."¿¡µµ ÀÏÄ¡ÇÏ´Â ¹®ÀÚ ºÎ·ùÀÌ´Ù.
ÀÌ ¼½¼Ç¿¡¼ ¸¶Áö¸·À¸·Î ´Ù·ê ¸ÞŸ¹®ÀÚ´Â .ÀÌ´Ù. »õÁÙ¹®ÀÚ »©°í´Â ¾î¶² ¹®Àڿ͵µ ÀÏÄ¡ÇÑ´Ù. ±×¸®°í ´ë¾È ¸ðµå(re.DOTALL
)°¡ ÀÖ¾î¼ »õÁÙ¹®ÀÚÁ¶Â÷µµ ÀÏÄ¡½Ãų ¼ö ÀÖ´Ù. "."´Â ``¾î¶² ¹®ÀÚ''¶óµµ ÀÏÄ¡½ÃÅ°°í ½ÍÀ» ¶§ ÀÚÁÖ »ç¿ëµÈ´Ù.
´Ù¾çÇÑ ¹®ÀÚ ÁýÇÕ¿¡ ÀÏÄ¡½ÃÅ°´Â ´É·ÂÀº Á¤±Ô Ç¥Çö½ÄÀÌ ÇÒ ¼ö Àִ ù ¹ø° ´É·ÂÀ¸·Î ÀÌ´Â ¹®ÀÚ¿¿¡ ¸Þ½îµå¿¡¼´Â ¾ÆÁ÷ °¡´ÉÇÏÁö ¾ÊÀº ´É·ÂÀÌ´Ù. ±×·¸Áö¸¸, ±× Á¤µµ°¡ 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}Àº ?¿Í ¶È°°´Ù. ´õ ª°í Àбâ ÆíÇϱ⠶§¹®¿¡ °¡´ÉÇϸé *, +, ¶Ç´Â ?¸¦ »ç¿ëÇÏ´Â ÆíÀÌ ÁÁ´Ù.
°£´ÜÇÑ ¸î°¡Áö Á¤±Ô Ç¥Çö½ÄÀ» µÑ·¯ º¸¾Ò´Ù. ±×·¸ÇÏ¸é ¾î¶»°Ô ½ÇÁ¦·Î Á¤±Ô Ç¥Çö½ÄÀ» ÆÄÀ̽㿡¼ »ç¿ëÇϴ°¡? re ¸ðµâÀÌ Á¤±Ô Ç¥Çö½Ä¿¡ ´ëÇÑ ÀÎÅÍÆäÀ̽º¸¦ Á¦°øÇÏ¿© ÁֹǷÎ, RE¸¦ °´Ã¼·Î ÄÄÆÄÀÏÇؼ ±×µé¿¡ ´ëÇØ ÀÏÄ¡¸¦ ¼öÇàÇÒ ¼ö ÀÖ´Ù.
Á¤±Ô Ç¥Çö½ÄÀº 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¸¦ Ç¥ÇöÇϸé ÆÄÀ̽㠾ð¾î´Â ´õ °£´ÜÇÏÁö¸¸, ´ÜÁ¡ÀÌ Çϳª Àִµ¥ ´ÙÀ½ ¼½¼ÇÀÇ ÁÖÁ¦·Î »ï°Ú´Ù.
ÀÌÀü¿¡ ¾ð±ÞÇÑ ¹Ù¿Í °°ÀÌ, Á¤±Ô Ç¥Çö½ÄÀº ¿ª»ç¼± ¹®ÀÚ ("\")¸¦ »ç¿ëÇÏ¿© ±×ÀÇ Æ¯º°ÇÑ Àǹ̸¦ ¿äûÇÏÁö ¾Ê°í Ưº°ÇÑ ÇüŸ¦ ³ªÅ¸³»°Å³ª Ưº°ÇÑ ¹®ÀÚ¸¦ »ç¿ëÇϵµ·Ï Çã¿ëÇÑ´Ù. ÀÌ´Â ÆÄÀ̽ãÀÌ °°Àº ¹®ÀÚ¸¦ °°Àº ¸ñÀûÀ¸·Î ¹®ÀÚ¿ ±âÈ£¹®ÀÚ¿¡ »ç¿ëÇÏ´Â °Í°ú Ãæµ¹ÇÑ´Ù.
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" |
ÄÄÆÄÀÏµÈ Á¤±Ô Ç¥Çö½ÄÀ» ³ªÅ¸³»´Â °´Ã¼¸¦ È®º¸Çß´Ù°í Çϸé, ±×°ÍÀ¸·Î ¹«¾ùÀ» ÇÒ °ÍÀΰ¡? 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)
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( ... )
ÀϹÝÀûÀ¸·Î ³ª´Â ´Ü Çѹø¸¸ »ç¿ëÇÒ ¶§¿¡µµ ÄÄÆÄÀÏµÈ °´Ã¼·Î ÀÛ¾÷ÇÏ´Â ÆíÀ» ¼±È£ÇÑ´Ù. ±×·¯³ª ³ª¸¸ÇÑ ¼ø¼öÁÖÀÇÀÚ´Â º°·Î ¾øÀ» °ÍÀÌ´Ù.
ÄÄÆÄÀÏ Ç¥½ÄÀ¸·Î Á¤±Ô Ç¥Çö½ÄÀÌ ¾î¶»°Ô ÀÛµ¿ÇÒ °ÍÀΰ¡¿¡ °üÇÑ ¸ð½ÀÀ» º¯°æÇÒ ¼ö ÀÖ´Ù. Ç¥½ÄÀº 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¸¦ ´õ ±ú²ýÇÏ°í ÀÌÇØÇϱ⠽±°Ô Á¶Á÷ÇÒ ¼ö ÀÖ´Ù. |
·ÎÄÉÀÏÀº ¾ð¾îÀÇ Â÷À̸¦ °í·ÁÇÏ´Â ÇÁ·Î±×·¥À» ¸¸µå´Âµ¥ µµ¿òÀ» ÁÙ ¸ñÀûÀ¸·Î ¸¸µé¾îÁø C ¶óÀ̺귯¸®ÀÇ Æ¯Â¡ÀÌ´Ù. ¿¹¸¦ µé¾î, ÇÁ¶û½º¾î ÅؽºÆ®¸¦ ó¸®ÇÏ°íÀÚ Çϸé, \w+¸¦ ´Ü¾î¿¡ ÀÏÄ¡½Ãų ¼ö ÀÖ¾úÀ¸¸é ÇÏ°í ¹Ù¶óÁö¸¸, \w´Â ¿ÀÁ÷ ¹®ÀÚ ºÎ·ù [A-Za-z]¿¡¸¸ ÀÏÄ¡ÇÒ »ÓÀÌ´Ù; ´Ù½Ã ¸»ÇØ "é" ¶Ç´Â "ç"¿¡ ÀÏÄ¡ÇÏÁö ¾Ê´Â´Ù. ½Ã½ºÅÛÀÌ Á¦´ë·Î ȯ°æ¼³Á¤µÇ¾î ÀÖ°í ÇÁ¶û½º¾î ·ÎÄÉÀÏÀÌ ¼±ÅõǾú´Ù¸é, ƯÁ¤ C ÇÔ¼öµéÀÌ ÇÁ·Î±×·¥¿¡°Ô "é"ÀÌ ±âÈ£·Î °£ÁֵǾî¾ß ÇÑ´Ù°í ¸»ÇØ ÁÙ °ÍÀÌ´Ù. Á¤±Ô Ç¥Çö½ÄÀ» ÄÄÆÄÀÏÇÒ ¶§ LOCALE Ç¥½ÄÀ» ¼³Á¤ÇØ ³õÀ¸¸é ±× °á°ú·Î ³ª¿Â ÄÄÆÄÀÏ °´Ã¼°¡ \w¿¡ ´ëÇÏ¿© ÀÌ·± C ÇÔ¼öµéÀ» »ç¿ëÇÏ°Ô µÈ´Ù; ÀÌ°ÍÀÌ ´õ ´À¸®Áö¸¸, \w+¸¦ ¿¹»ó´ë·Î ÇÁ¶û½º¾î ´Ü¾î¿¡ ÀÏÄ¡½ÃÅ°µµ·Ï ÇÒ ¼ö ÀÖ´Ù.
º¸Åë ^´Â ¹®ÀÚ¿ÀÇ Ã³À½¿¡¼¸¸ ÀÏÄ¡ÇÑ´Ù. ±×¸®°í $´Â ¹®ÀÚ¿ÀÇ ³¡¿¡¼¸¸ ÀÏÄ¡ÇÏ°í, (Ȥ½Ã ÀÖ´Ù¸é) ¹®ÀÚ¿ÀÇ ³¡¿¡ »õÁÙ¹®ÀÚ ¹Ù·Î ¾Õ¿¡¼ ÀÏÄ¡ÇÑ´Ù. ÀÌ Ç¥½ÄÀÌ ÁöÁ¤µÇ¸é, ^´Â ¹®ÀÚ¿ÀÇ Ã³À½°ú ±× ¹®ÀÚ¿¿¡¼ ´ÙÀ½¿¡ »õÁÙ¹®ÀÚ°¡ ³ª¿À´Â Áï½Ã °¢ ÁÙÀÇ ½ÃÀÛ¿¡¼ ÀÏÄ¡ÇÑ´Ù. ºñ½ÁÇÏ°Ô, $ ¸ÞŸ¹®ÀÚ´Â °¢ ÁÙÀÇ ³¡°ú ¹®ÀÚ¿ÀÇ ³¡¿¡¼ ÀÏÄ¡ÇÑ´Ù (°¢ »õÁÙ¹®ÀÚ ¹Ù·Î ¾Õ¿¡¼).
¿¹¸¦ µé¾î, ´ÙÀ½Àº 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¸¦ »ç¿ëÇÑ ¹öÀüº¸´Ù ¿©ÀüÈ÷ ´õ ÀÌÇØÇϱ⠾î·Æ´Ù.
Áö±Ý±îÁö´Â Á¤±Ô Ç¥Çö½ÄÀÇ ÀϺθ¦ ´Ù·ç¾î º¸¾ÒÀ» »ÓÀÌ´Ù. ÀÌ ¼½¼Ç¿¡¼´Â, »õ·Î¿î ¸ÞŸ¹®ÀÚµé ¸î°¡Áö¸¦ ´Ù·ç¾î º¸°í, ±×·ìÀ» »ç¿ëÇÏ¿© ÀÏÄ¡µÈ ÅؽºÆ®ÀÇ ÀϺθ¦ ¿¶÷ÇÏ´Â ¹ýÀ» ´Ù·ç¾î º¸°Ú´Ù.
¾ÆÁ÷ ´Ù·ç¾î º¸Áö ¾ÊÀº ¸ÞŸ¹®ÀÚµéÀÌ ¸î°¡Áö ÀÖ´Ù. ±×µé ´ëºÎºÐÀ» ÀÌ ¼½¼Ç¿¡¼ ´Ù·ç¾î º¸°Ú´Ù.
³²¾ÆÀÖ´Â ¸ÞŸ¹®ÀÚÁß ´Ù·ç¾î º¼ ¸ÞŸ¹®ÀÚ´Â 0-³Êºñ ¼±¾ðÀÌ´Ù. 0-³Êºñ ¼±¾ð ¹®Àڵ鿡¼ ¿£ÁøÀº ¹®ÀÚ¿¿¡¼ ¾ÕÀ¸·Î ³ª¾Æ°¡Áö ¾Ê´Â´Ù; ´ë½Å¿¡, ÀüÇô ¹®ÀÚµéÀ» ¼ÒºñÇÏÁö ¾ÊÀ¸¸ç, ±×³É ¼º°øÇϰųª ½ÇÆÐÇÒ »ÓÀÌ´Ù. ¿¹¸¦ µé¾î, \b´Â ÇöÀç À§Ä¡°¡ ¾ð¾îÀÇ °æ°è¿¡ ÀÖ´Ù´Â ¼±¾ðÀÌ´Ù; À§Ä¡´Â \b¿¡ ÀÇÇؼ ÀüÇô º¯ÇÏÁö ¾Ê´Â´Ù. ÀÌ´Â °ð 0-³Êºñ ¼±¾ðÀÌ Àý´ë·Î ¹Ýº¹µÇÁö ¾Ê´Â´Ù´Â ¶æÀε¥, ÁÖ¾îÁø À§Ä¡¿¡¼ ÇÑ ¹ø ÀÏÄ¡Çϸé, ¼ö ¾øÀÌ ¸¹Àº Ƚ¼ö¸¦ ÀÏÄ¡ÇÒ °ÍÀÌ »·Çϱ⠶§¹®ÀÌ´Ù.
±âÈ£¹®ÀÚ "|"¿¡ ÀÏÄ¡½ÃÅ°·Á¸é, \|À» »ç¿ëÇϰųª, ¶Ç´Â ´ÙÀ½°ú °°ÀÌ [|] ¹®ÀÚ ºÎ·ù ¾È¿¡ ½Î ³ÖÀÚ.
¿¹¸¦ µé¾î, "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>
±âÈ£¹®ÀÚ "$"¸¦ ÀÏÄ¡½ÃÅ°·Á¸é, \$¸¦ »ç¿ëÇϰųª ´ÙÀ½°ú °°ÀÌ [$] ¹®ÀÚ ºÎ·ù ¾È¿¡ ½Î ³ÖÀÚ.
´ÙÀ½ ¿¹Á¦¿¡¼´Â ¿ÏÀüÇÑ ´Ü¾îÀÏ ¶§¸¸ "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´Â ÆÄÀ̽ãÀÇ ¹®ÀÚ¿ ¹®ÀÚ±âÈ£¿ÍÀÇ È£È¯¼ºÀ» À§Çؼ ¹é½ºÆäÀ̽º ¹®ÀÚ¸¦ ³ªÅ¸³½´Ù.
´Ü¼øÈ÷ 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'
ÀÌ¿Í °°Àº ¿ªÂüÁ¶´Â ¹®ÀÚ¿À» ±×³É Ž»öÇÒ ¶§´Â º°·Î ¾µ¸ð°¡ ¾ø´Ù -- ÀÌ·± ½ÄÀ¸·Î µ¥ÀÌÅÍ°¡ ¹Ýº¹µÇ´Â ÅؽºÆ® ÇüÅ´ °ÅÀÇ ¾ø´Ù -- ÇÏÁö¸¸ ¹®ÀÚ¿ ´ëü¸¦ ¼öÇàÇÒ ¶§´Â ¾ÆÁÖ ¾µ¸ð°¡ ÀÖ´Ù´Â °ÍÀ» ¾Ë°Ô µÉ °ÍÀÌ´Ù.
Á¤±³ÇÑ 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'
¶Ç´Ù¸¥ 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$).*$
ÀÌ ½ÃÁ¡±îÁö´Â, Á¤ÀûÀÎ ¹®ÀÚ¿¿¡ ´ëÇÏ¿© Ž»öÀ» ¼öÇàÇßÀ» »ÓÀÌ´Ù. Á¤±Ô Ç¥Çö½ÄÀº ¶ÇÇÑ ´Ù¾çÇÑ ¹æ¹ýÀ¸·Î, ¹®ÀÚ¿À» º¯°æÇϴµ¥¿¡µµ »ç¿ëµÈ´Ù. RegexObject ¸Þ½îµå¸¦ »ç¿ëÇÏ¸é µÈ´Ù:
¸Þ½îµå/¼Ó¼º | ¸ñÀû |
---|---|
split() |
RE°¡ ÀÏÄ¡ÇÒ ¶§¸¶´Ù ¹®ÀÚ¿À» °¥¶ó¼ ¸®½ºÆ®¿¡ ³Ö´Â´Ù |
sub() |
RE°¡ ÀÏÄ¡ÇÏ´Â ¸ðµç ÇϺι®ÀÚ¿À» ã¾Æ¼ ´Ù¸¥ ¹®ÀÚ¿·Î ¹Ù²Û´Ù. |
subn() |
sub()¿Í ¶È °°Àº ÀÏÀ» ÇÏÁö¸¸, »õ·Î¿î ¹®ÀÚ¿°ú ´ëÄ¡ Ƚ¼ö¸¦ ¹ÝȯÇÑ´Ù |
RegexObjectÀÇ split() ¸Þ½îµå´Â RE°¡ ÀÏÄ¡ÇÏ´Â °÷¸¶´Ù ¹®ÀÚ¿À» °¥¶ó¼, ±× Á¶°¢µéÀ» ´ãÀº ¸®½ºÆ®¸¦ ¹ÝȯÇÑ´Ù. ¹®ÀÚ¿ÀÇ split() ¸Þ½îµå¿Í ºñ½ÁÇÏÁö¸¸, °¡¸¦ ¼ö ÀÖ´Â °¡¸§ÀÚ¿¡¼ ÈξÀ ´õ ¸¹Àº À¶Å뼺À» Á¦°øÇÑ´Ù; split()Àº ¿ÀÁ÷ °ø¹éÀ̳ª °íÁ¤µÈ ¹®ÀÚ¿·Î °¡¸£±â¸¦ Áö¿øÇÒ »ÓÀÌ´Ù. ¿¹»óÇÏ´Ù½ÃÇÇ, ¸ðµâ ¼öÁØÀÇ re.split() ÇÔ¼öµµ ¿ª½Ã ÀÖ´Ù.
string [, maxsplit =
0 ]) |
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.']
¶Ç´Ù¸¥ ÀϹÝÀûÀÎ ÀÛ¾÷Àº ÆÐÅÏ¿¡ ÀÏÄ¡ÇÏ´Â ¸ðµç °ÍµéÀ» ¹ß°ßÇؼ, ´Ù¸¥ ¹®ÀÚ¿·Î ġȯÇÏ´Â °ÍÀÌ´Ù. sub() ¸Þ½îµå´Â ¹®ÀÚ¿À̳ª ÇÔ¼öÀÏ ¼ö ÀÖ´Â ±³Ã¼ °ª°ú, ±×¸®°í ó¸®µÉ ¹®ÀÚ¿À» ÃëÇÑ´Ù.
replacement, string[, count =
0 ]) |
¼±ÅÃÀûÀÎ Àμö 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'
¸¦ ¹ÝȯÇÑ´Ù.
Á¤±Ô Ç¥Çö½ÄÀº ¾î¶² °÷¿¡´Â °·ÂÇÑ µµ±¸ÀÌÁö¸¸, ¾î¶² ¸é¿¡¼ ±× ÇàÀ§´Â Á÷°üÀûÀÌÁö ¾Ê°í ¶§·Î´Â ¿¹»ó´ë·Î ÇàÀ§ÇÏÁö ¾Ê´Â´Ù. ÀÌ ¼½¼Ç¿¡¼´Â °¡Àå ÈçÇÏ°Ô ºüÁö´Â ÇÔÁ¤µéÀ» ÁöÀûÇØ º¸°Ú´Ù.
¶§·Î´Â 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 ¸ðµâ¿¡ ÀÇÁ¸Çϱâ Àü¿¡, ¸ÕÀú ¹®Á¦°¡ ´õ ºü¸£°í ´õ °£´ÜÇÑ ¹®ÀÚ¿ ¸Þ½îµå·Î ÇØ°áµÉ ¼ö ÀÖ´ÂÁö »ý°¢ÇØ º¸ÀÚ.
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()¸¦ »ç¿ëÇÏÀÚ.
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 Çؼ®±â¸¦ ÀÌ¿ëÇÏÀÚ.)
Áö±Ý±îÁö ¾î¼¸é Á¤±Ô Ç¥Çö½ÄÀÌ ¾ÆÁÖ °£°áÇÑ Ç¥±â¹ýÀÏ ¼ö ÀÖÁö¸¸, ÀбⰡ ¾ÆÁÖ ¾î·Æ´Ù´Â °ÍÀ» ´«Ä¡Ã«À» ¼öµµ ÀÖ°Ú´Ù. Àû´çÇÏ°Ô º¹ÀâÇÑ 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*$")
Á¤±Ô Ç¥Çö½ÄÀº º¹ÀâÇÑ ÁÖÁ¦ÀÌ´Ù. ÀÌ ¹®¼°¡ ÀÌÇØÇϴµ¥ µµ¿òÀÌ µÇ¾ú´ÂÁö ¸ð¸£°Ú´Ù. ÀÌÇØ°¡ ¾È°¡´Â ºÎºÐÀÌ Àְųª ¿©±â¿¡¼ ´Ù·çÁö ¾ÊÀº ¹®Á¦°¡ ÀÖ´Ù¸é, º»Àο¡°Ô °³¼±À» À§ÇÑ Á¦¾ÈÀ» º¸³»Áֱ⸦ ¹Ù¶õ´Ù.
Á¤±Ô Ç¥Çö½Ä¿¡ °üÇÑ °¡Àå ¿Ïº®ÇÑ Ã¥Àº ¿À¶óÀϸ®(O'Reilly)¿¡¼ ¹ß°£ÇÑ Á¦ÇÁ¸® ÇÁ¸®µé(Jeffrey Friedl)ÀÇ Á¤±Ô Ç¥Çö½Ä Á¤º¹(Mastering Regular Expressions)ÀÏ °ÍÀÌ´Ù. ºÒÇàÇÏ°Ôµµ, °ÅÀÇ ÆÞ°ú ÀÚ¹Ù ÃëÇâÀÇ Á¤±Ô Ç¥Çö½Ä¿¡ ÁýÁßÇÒ »Ó ÆÄÀ̽㿡 °üÇؼ´Â ÀüÇô ´Ù·çÁö ¾Ê´Â´Ù. ±×·¡¼ ÆÄÀ̽ãÀ¸·Î ÇÁ·Î±×·¡¹ÖÇϴµ¥ ÂüÁ¶Çϱ⿡´Â º°·Î ¾µ¸ð°¡ ¾øÀ» °ÍÀÌ´Ù. (ù ÆÇÀº ÆÄÀ̽㿡¼ ÀÌÁ¦ Æó±âµÈ regex ¸ðµâÀ» ´Ù·ç¾ú°í, ÀÌ´Â º°·Î µµ¿òÀÌ µÇÁö ¸øÇÒ °ÍÀÌ´Ù.)
ÀÌ ¹®¼´Â 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)°¡ °øÇåÇÏ¿´´Ù.