2015-05-09 258 views
1

我想匹配浮點數,可能是在0.1234567或1.23E-5 下面表格是我的Python代碼:正則表達式:可能會或可能不會包含字符串

import re 
def main(): 
    m2 = re.findall(r'\d{1,4}:[-+]?\d+\.\d+(e-\d+)?', '1:0.00003 3:0.123456 8:-0.12345') 
    for svs_elem in m2: 
     print svs_elem 

main() 

它打印空白...根據我的測試,問題出現在(e- \ d +)中?部分。

+0

什麼是'1:0.00003 3:0.123456 8:-0.12345'?從哪裏抽取的字符串? – user2963623

+0

http://www.regular-expressions.info/floatingpoint.html –

+0

感謝您提供的信息 – daydayup

回答

4

見強調:

Help on function findall in module re: 
findall(pattern, string, flags=0) 
    Return a list of all non-overlapping matches in the string. 
    If one or more groups are present in the pattern, return a 
    list of groups; this will be a list of tuples if the pattern 
    has more than one group. 
    Empty matches are included in the result.

你有一個組,所以它的返回而不是整場比賽,但它不以任何你的情況相符。使其無法捕獲(?:e-\d+)

m2 = re.findall(r'\d{1,4}:[-+]?\d+\.\d+(?:e-\d+)?', '1:0.00003 3:0.123456 8:-0.12345') 
+0

如果您想抓住我列入的示例來說明捕獲組的工作原理,我會刪除我的答案。 – chepner

2

使用非捕獲組。匹配成功,但輸出是不匹配的可選組的內容。

看到輸出,當你輸入包括像e-6

>>> re.findall(r'\d{1,4}:[-+]?\d+\.\d+(e-\d+)?', '1:0.00003 3:0.123456 8:-0.12345e-6') 
['', '', 'e-6'] 

對於非捕獲組((?:...)):

>>> re.findall(r'\d{1,4}:[-+]?\d+\.\d+(?:e-\d+)?', '1:0.00003 3:0.123456 8:-0.12345e-6') 
['1:0.00003', '3:0.123456', '8:-0.12345e-6'] 

下面的是一些簡單的例子來說明如何捕獲小組的工作以及它們如何影響findall的輸出。首先,沒有一個羣體:

>>> re.findall("a[bc]", "ab") 
["ab"] 

這裏,字符串「AB」匹配正則表達式,所以我們打印的一切正則表達式匹配。

>>> re.findall("a([bc])", "ab") 
["b"] 

這一次,我們把[bc]捕獲組裏面,這樣即使整個字符串仍然由正則表達式匹配,findall僅包括在其輸出中捕獲組內的部分。

>>> re.findall("a(?:[bc])", "ab") 
["ab"] 

現在,通過捕獲基團轉化爲一個非捕獲基,findall再次使用其輸出的正則表達式整個的匹配。

>>> re.findall("a([bc])?", "a") 
[''] 
>>> re.findall("a(?:[bc])?", "a") 
['a'] 

在這兩個最後一種情況中,正則表達式作爲一個整體相匹配,因此,返回值是一個非空列表。在第一個中,捕獲組本身並不匹配任何文本,所以空字符串是輸出的一部分。第二,我們沒有捕獲組,所以整個正則表達式的匹配被用於輸出。

+0

謝謝!你能解釋爲什麼捕獲的一個(我寫的)沒有捕獲數字,而使用它捕獲的非捕獲組?我仍然不明白如何不捕捉作品。在(?:...)中是什麼?代表?我只是不明白這一點,雖然它對你來說很直觀 – daydayup

+1

當你的正則表達式包含一個捕獲組'(...),'findall'命令的輸出包含組的內容。在你的情況下,由於捕獲組是可選的('(...)?'),因此該組不匹配任何文本,因此輸出中不包含任何文本。當你使用'(?:...)'而不是簡單的'(...)'使這個組成爲非捕獲組時,'findall'使用與其輸出中整個正則表達式相匹配的文本。 – chepner

+0

這聽起來像任何可選字符串(可能或可能不包含),我也應該使用非捕獲組來獲取findall()輸出的東西? – daydayup

相關問題