2.8 多行匹�模�¶
问题¶
ä½ æ£åœ¨è¯•ç�€ä½¿ç”¨æ£åˆ™è¡¨è¾¾å¼�去匹é…�一大å�—çš„æ–‡æœ¬ï¼Œè€Œä½ éœ€è¦�跨越多行去匹é…�。
解决方案¶
è¿™ä¸ªé—®é¢˜å¾ˆå…¸åž‹çš„å‡ºçŽ°åœ¨å½“ä½ ç”¨ç‚¹(.)去匹é…�ä»»æ„�å—符的时候,忘记了点(.)ä¸�能匹é…�æ�¢è¡Œç¬¦çš„事实。 比如,å�‡è®¾ä½ 想试ç�€åŽ»åŒ¹é…�Cè¯è¨€åˆ†å‰²çš„æ³¨é‡Šï¼š
>>> comment = re.compile(r'/\*(.*?)\*/')
>>> text1 = '/* this is a comment */'
>>> text2 = '''/* this is a
... multiline comment */
... '''
>>>
>>> comment.findall(text1)
[' this is a comment ']
>>> comment.findall(text2)
[]
>>>
为了修æ£è¿™ä¸ªé—®é¢˜ï¼Œä½ å�¯ä»¥ä¿®æ”¹æ¨¡å¼�å—ç¬¦ä¸²ï¼Œå¢žåŠ å¯¹æ�¢è¡Œçš„æ”¯æŒ�。比如:
>>> comment = re.compile(r'/\*((?:.|\n)*?)\*/')
>>> comment.findall(text2)
[' this is a\n multiline comment ']
>>>
在这个模å¼�ä¸ï¼Œ (?:.|\n) 指定了一个é�žæ�•获组
(也就是它定义了一个仅仅用��匹�,而�能通过�独�获或者编�的组)。
讨论¶
re.compile() 函数接å�—ä¸€ä¸ªæ ‡å¿—å�‚æ•°å�« re.DOTALL ,在这里é�žå¸¸æœ‰ç”¨ã€‚
它å�¯ä»¥è®©æ£åˆ™è¡¨è¾¾å¼�ä¸çš„点(.)匹é…�包括æ�¢è¡Œç¬¦åœ¨å†…的任æ„�å—符。比如:
>>> comment = re.compile(r'/\*(.*?)\*/', re.DOTALL)
>>> comment.findall(text2)
[' this is a\n multiline comment ']
对于简å�•的情况使用 re.DOTALL æ ‡è®°å�‚数工作的很好,
但是如果模å¼�é�žå¸¸å¤�æ�‚æˆ–è€…æ˜¯ä¸ºäº†æž„é€ å—符串令牌而将多个模å¼�å�ˆå¹¶èµ·æ�¥(2.18节有详细æ��è¿°),
è¿™æ—¶å€™ä½¿ç”¨è¿™ä¸ªæ ‡è®°å�‚æ•°å°±å�¯èƒ½å‡ºçŽ°ä¸€äº›é—®é¢˜ã€‚
å¦‚æžœè®©ä½ é€‰æ‹©çš„è¯�,最好还是定义自己的æ£åˆ™è¡¨è¾¾å¼�模å¼�ï¼Œè¿™æ ·å®ƒå�¯ä»¥åœ¨ä¸�需è¦�é¢�å¤–çš„æ ‡è®°å�‚数下也能工作的很好。