2016-04-17 25 views
0

當試圖在Python中做一些正則表達式匹配時,我偶然發現了一個奇怪的問題。我想匹配表單xxx.yyy上的十進制數,並將它們分成三組進行進一步處理。我跑了類似下面的代碼片段。Python的正則表達式不夠貪婪,多個組

#!/usr/bin/env python3 

import re 

matches = re.search("a=(\d+)(\.?)(\d+?)", "var k = 2;var a; a=46") 
print(matches.group(1)) 

打印返回4,而46將是預期的結果。爲什麼會這樣? Python文檔指出regexp +和*是貪婪的,但這似乎並不是這種情況。原因似乎是最後一位數字在最後一組中結束。我需要至少匹配第一組和最後一組。如果我使用最後一個來區分十進制數和非十進制數,我可以跳過中間組。

但是,如果匹配的數字是小數,它似乎工作。

#!/usr/bin/env python3 

import re 

matches = re.search("a=(\d+)(\.?)(\d+?)", "var k = 2;var a; a=46.3") 
print(matches.group(1)) 

打印46.如果你能幫我解決這個難題,我會很高興。謝謝。

回答

1

你有兩組小數,至少有1位。所以組1是4,組2是空的,組3是6。如果你想匹配所有數字在.面前來搭配,你必須做出的第二和第三組可選:

matches = re.search("a=(\d+)(?:(\.?)(\d+))?", "var k = 2;var a; a=46") 
+0

做了一些評估,我相信這個答案是最接近我想達到的目標。謝謝@Daniel。 – Fakenick

2

應該

matches = re.search("a=(\d+(?:\.\d+)?)", "var k = 2;var a; a=46") 

Ideone Demo

原因

你的正則表達式是

(\d+)(\.?)(\d+?) 

.是可選的,這意味着您的.和下一個\d+?是相互獨立的。這意味着它首先匹配所有的數字(即直到4在你的例子中),直到下一個.這是可選的,並且它需要至少一個數字讓最後一組成功。所以6將在最後被捕獲的組中。

這張圖片將更加清晰

enter image description here

+0

什麼程序/網站是從截圖?看起來很酷 – Keatinge

+1

@Racialz它來自http://www.regex101.com/ 編寫正則表達式後,您可以在該網站上使用正則表達式調試器模式(出現在左側) – rock321987