2015-02-12 60 views
1

我試圖解析一個文本文件並從中提取某些整數。在我的文本文件中的每一行都是這樣的格式:在Python中使用re.findall()的問題

a和b

其中a是一個整數,B可以是浮動或整數

如。 '4和10.2356'或'400和25'

我需要提取a和b。我試圖用re.findall()來做到這一點:

print re.findall("\d+", txt)[0] #extract a 

#Extract b   
try: 
    print float(re.findall("\d+.\d+", txt)[1]) 
except IndexError: 
    print float(re.findall("\d+.\d+", txt)[0]) 

這裏txt是從文件中的單行。嘗試和除了塊的原因如下:

如果a是單個數字整數,例如。 4,代碼的try部分只返回b。但是,如果a不是一個整數,例如。 400,代碼的嘗試部分返回a和b。我發現這很奇怪。

但是,我不知道如何修改上面的代碼來提取b時,它是一個整數。我嘗試了另一個嘗試,除了bock在現有的except塊之外,但它給了我奇怪的結果(在某些情況下a和b被連接)。請幫助我。

另外,任何人都可以請告訴我\ d +和\ d +。\ d +與爲什麼\ d +。\ d +返回400而不是4即使兩者都是整數之間的區別。

回答

2

只需將與小數部分匹配的模式設置爲可選。

>>> s = '4 and 10.2356' 
>>> re.findall(r'\d+(?:\.\d+)?', s) 
['4', '10.2356'] 
>>> print(int(re.findall(r'\d+(?:\.\d+)?', s)[0])) 
4 
>>> print(float(re.findall(r'\d+(?:\.\d+)?', s)[1])) 
10.2356 
  • \d+匹配一個或多個數字。
  • \d+.\d+匹配一個或多個數字加上任何單個字符加一個或多個數字。
  • \d+\.\d+匹配一個或多個數字字符pus一個文字點加一個或多個數字。
  • \d+(?:\.\d+)?匹配整數以及浮點數,因爲我們將匹配小數部分的模式設置爲可選。 ?之後捕獲或不捕獲組會將整個組轉換爲可選組。
+0

非常感謝! – foobar 2015-02-12 23:55:34