2011-10-23 22 views
1

我正在學習正則表達式,我想檢查python正在使用的機制。Python 2.6正則表達式機制?

我的正則表達式:

s = re.findall(ur"\d+\.?\d+", "123,45.567 78"). 

首先,我認爲結果將是隻有45.567

當我運行它,我得到了所有的數字,包括小數點([「123」 ,「45.567」,「78」]),但是使用的過程並不十分清楚。

這是我的理解: Python的第一次啓動時用表達式\ d +,將發現123是確定的(貪婪搜索儘可能逗號之前)。接下來,它期望一個可選的點(。?)不在那裏,並且沒關係。接下來,它需要一個或多個數字。但下一個字符是一個不被接受的逗號(,)。 Python將回到12(下降3)。 12滿滿第一個\ d +。接下來,它期望一個不存在的可選點,接下來它需要一個或多個數字,3個與其匹配。也就是說,123個fullfils是整個正則表達式。

Python會記住123的偏移量2,並在123之後重新開始。也就是說,Python會開始在字符串45.567,78處使用整個正則表達式。

也就是說,整個正則表達式用於三倍。第一次發現123 找到45.567和第三次它會找到78

+1

請多關注問題的格式。大塊文字難以閱讀。並使用代碼格式。 – Mat

+0

運行's = re.findall(ur「\ d + \。?\ d +」,「123,45.567 78」,re.DEBUG)應該可以幫助您瞭解Python的行爲。 – robert

+0

您對第一個「123」匹配的描述是正確的。匹配後,正則表達式引擎會嘗試匹配緊接在第一個匹配之後的位置(逗號前的位置),並且這會失敗。但是引擎不會放棄 - 它會在字符串中的下一個字符上「碰撞」_並且能夠匹配「45.567」。然後在空間之前再次失敗並碰撞,然後找到第三個匹配。正則表達式引擎會在字符串中的每個位置檢查匹配,即使在字符串中最後一個字符後面的位置也會碰撞。 – ridgerunner

回答

4

\d+\.?\d+永遠也匹配\d+\d+因爲.是可選的(也許你現在明白爲什麼它匹配所有)的第二次。所以它可以像約束條件那樣回溯。

1

documentation of findall(重點煤礦):

返回所有非重疊的字符串模式比賽,作爲一個字符串列表。

在我看來,這將描述你所看到的行爲。要獲得不重疊的比賽,您必須在上一場比賽結束後開始下一場比賽。