2.7 最çŸåŒ¹é…�模å¼�¶
问题¶
ä½ æ£åœ¨è¯•ç�€ç”¨æ£åˆ™è¡¨è¾¾å¼�匹é…�æŸ�个文本模å¼�,但是它找到的是模å¼�的最长å�¯èƒ½åŒ¹é…�。 è€Œä½ æƒ³ä¿®æ”¹å®ƒå�˜æˆ�查找最çŸçš„å�¯èƒ½åŒ¹é…�。
解决方案¶
这个问题一般出现在需è¦�匹é…�一对分隔符之间的文本的时候(比如引å�·åŒ…å�«çš„å—符串)。 为了说明清楚,考虑如下的例å�:
>>> str_pat = re.compile(r'"(.*)"')
>>> text1 = 'Computer says "no."'
>>> str_pat.findall(text1)
['no.']
>>> text2 = 'Computer says "no." Phone says "yes."'
>>> str_pat.findall(text2)
['no." Phone says "yes.']
>>>
在这个例å�ä¸ï¼Œæ¨¡å¼� r'\"(.*)\"' çš„æ„�图是匹é…�被å�Œå¼•å�·åŒ…å�«çš„æ–‡æœ¬ã€‚
但是在æ£åˆ™è¡¨è¾¾å¼�ä¸*æ“�ä½œç¬¦æ˜¯è´ªå©ªçš„ï¼Œå› æ¤åŒ¹é…�æ“�作会查找最长的å�¯èƒ½åŒ¹é…�。
于是在第二个例å�䏿�œç´¢ text2 的时候返回结果并ä¸�是我们想è¦�的。
为了修æ£è¿™ä¸ªé—®é¢˜ï¼Œå�¯ä»¥åœ¨æ¨¡å¼�ä¸çš„*æ“�作符å�Žé�¢åŠ ä¸Š?修饰符,就åƒ�è¿™æ ·ï¼š
>>> str_pat = re.compile(r'"(.*?)"')
>>> str_pat.findall(text2)
['no.', 'yes.']
>>>
è¿™æ ·å°±ä½¿å¾—åŒ¹é…�å�˜æˆ�é�žè´ªå©ªæ¨¡å¼�,从而得到最çŸçš„匹é…�,也就是我们想è¦�的结果。
讨论¶
这一节展示了在写包å�«ç‚¹(.)å—符的æ£åˆ™è¡¨è¾¾å¼�的时候é�‡åˆ°çš„一些常è§�问题。
在一个模å¼�å—符串ä¸ï¼Œç‚¹(.)匹é…�除了æ�¢è¡Œå¤–的任何å—符。
ç„¶è€Œï¼Œå¦‚æžœä½ å°†ç‚¹(.)å�·æ”¾åœ¨å¼€å§‹ä¸Žç»“æ�Ÿç¬¦(比如引å�·)之间的时候,那么匹é…�æ“�作会查找符å�ˆæ¨¡å¼�的最长å�¯èƒ½åŒ¹é…�。
è¿™æ ·é€šå¸¸ä¼šå¯¼è‡´å¾ˆå¤šä¸é—´çš„被开始与结æ�Ÿç¬¦åŒ…å�«çš„æ–‡æœ¬è¢«å¿½ç•¥æŽ‰ï¼Œå¹¶æœ€ç»ˆè¢«åŒ…å�«åœ¨åŒ¹é…�结果å—符串ä¸è¿”回。
通过在 * 或者 + è¿™æ ·çš„æ“�作符å�Žé�¢æ·»åŠ ä¸€ä¸ª ? å�¯ä»¥å¼ºåˆ¶åŒ¹é…�算法改æˆ�寻找最çŸçš„å�¯èƒ½åŒ¹é…�。