2012-02-22 62 views
0

我有一個python函數,它使用正則表達式匹配給定字符串中的一個(第一個)浮點數並返回該數字。修改python正則表達式來匹配所有浮點數而不是隻匹配第一個

我該如何修改它(正則表達式)來泛化函數,以便返回一個帶有字符串中所有數字的列表?

這裏是一個工作示範:

import re 

    def extract_number(s,notfound='NOT_FOUND'): 
     regex='[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?' # matching any floating point number 
     m = re.search(regex,s) 
     if(m): val=m.group() 
     else: val=notfound 
     return val 

    example='bla1.23bar4.5fuzz6.7cat8' 

    print example 
    print extract_number(example) 

在這個例子中,輸出是:

bla1.23bar4.5fuzz6.7cat8
1.23

,我正在尋找改進的功能,讓我們把它extract_numbers (注意複數!),應該輸出:

bla1.23bar4.5fuzz6.7cat8
[1.23, 4.5, 6.7, 8]

+0

只需使用're.findall' – wim 2012-02-22 10:00:54

回答

0

只需使用re.findall

def extract_number(s,notfound='NOT_FOUND'): 
    regex=r'[-+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?' 
    return re.findall(regex,s) 
+2

爲了使這項工作,你應該讓組非捕獲:regex = r'[ - +]?[0-9] * \。?[0-9] +(?:[eE] [ - +]?[0-9] +)?' – Kolmar 2012-02-22 10:03:57

+0

太好了,謝謝!非捕獲意味着什麼? – user1069609 2012-02-22 10:27:41

+0

@ user1069609非捕獲意味着不存儲組「()」的子匹配,參見[Groups](http://www.regular-expressions.info/brackets.html) – stema 2012-02-22 10:32:39

0

如果您正則表達式適用於單數,你可以使用re.finditer

re.finditer(r'[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?', 'bla1.23bar4.5fuzz6.7cat8') 

所以用

def extract_numbers(txt): 
    for m in re.finditer(r'[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?', txt): 
     yield float(m.group(0)) 

你可以得到所有的數字:

list(extract_numbers('bla1.23bar4.5fuzz6.7cat8')) 

個回報

[1.23, 4.5, 6.7000000000000002, 8.0] 
0

主要的變化是,使用findall

def extract_number(s, notfound='NOT_FOUND'): 
    regex = '[-+]?[0-9]+(?:\.[0-9]+)?(?:[eE][-+]?[0-9]+)?' # matching any floating point number 
    m = re.findall(regex, s) 
    if(m): val = m 
    else: val = notfound 
    return val 
  • 我也改變了你的正則表達式了一下,因爲你原來只返回空字符串與findall,因爲捕獲組。

  • m.group也不會因爲findall返回一個字符串列表工作了,和search返回MatchObject

+0

不知何故,它錯過了最後一個數字(8 )在我的例子'bla1.23bar4.5fuzz6.7cat8' – user1069609 2012-02-22 10:22:07

+0

@ user1069609你是對的,我錯過了讓分數可選,它現在是固定的。 – stema 2012-02-22 10:28:52

相關問題