2010-04-13 68 views
0

我需要在Python中使用正則表達式提取字符串的部分。Python中的正則表達式問題

我用基本的正則表達式很好,但是我看起來很糟糕。我已經在下面顯示了兩個示例記錄。最後一個大塊始終是一個貨幣字段,例如在第一個是4,76。在第二個是2,00。第二個帳戶號碼是\ d {6} - \ d {6}的模式。之後的任何事情都是貨幣。

24.02 24.02VALINTATALO MEGAHERTSI4,76- 
24.02 24.02DOE MRIDANG 157235-1234582,00- 

你能幫我解決這個正則表達式嗎?下面給出了我所寫的內容,但它將帳號中的「短劃線」之後的所有內容都視爲貨幣。

.*?(\d\d\.\d\d)(.*?)\s*(?<!\d{6}-\d{6})(\d*,\d\d) 

在此先感謝

+0

所以你想提取最後一個數字(貨幣),但它可以由一個帳號前綴?這是問題嗎? – compie 2010-04-13 19:11:32

+0

是的,請。我想我需要使用一種環顧四周。謝謝。 – 2010-04-13 19:13:47

回答

1
import re 

def extract_current(s): 
    s = s[s.rfind(' ')+1:-1] 
    s = re.sub('\d{6}-\d{6}', '', s) 
    s = re.sub('[A-Z]+', '', s) 
    return s 

print extract_current('24.02 24.02VALINTATALO MEGAHERTSI4,76-') 
print extract_current('24.02 24.02DOE MRIDANG 157235-1234582,00-') 

輸出:

4,76 
2,00 
0
(?<=\b\d{6}-\d{6}|[^-\d])\d+?,\d\d 

將匹配 「貨幣」 是要麼通過帳號或其他任何東西之前(除了一個連字符)。這足夠嗎?

0
(?<=\d{6}-\d{6}|[A-Z ])[0-9,]+(?=-$) 

此正則表達式的由任一帳號或字母或空間前面的數字和逗號第一字符串相匹配,並具有後破折號其爲線/字符串的最後一個字符。

1

這似乎工作:

.*?(\d\d\.\d\d)(.*?)(?:\d{6}-\d{6})?(\d*,\d\d) 

說明:(?:\ d {6} - \ d {6})看到賬號,但不記得了。它後面的問號允許帳號不在。我們不想記住帳號的原因是它拋出了我們通過match.group(3)訪問的索引。即,如果帳號存在,它可能在索引4。

+0

+1。另外,我知道OP使用了最初的'。*?',但是如果使用'.search'方法而不是'.match',我相信它可以被刪除。 – tzot 2010-04-13 22:24:00