2011-06-28 72 views
6

對於任何數字, 就像我正在搜索任意數字的字符串,正面或負面。 我一直在使用\ d +但找不到0或-1正則表達式,找到字符串中的任意數字

+4

試試'r「 - ?\ d +」'。編輯: - 不需要在'[]'外面轉義' – Evpok

+3

正則表達式不會根據它們的內容來讀取事物,而是根據它們在什麼字符類中進行讀取,因此您需要一個可選的「 - 」字符來匹配負值。也就是說,\ d +絕對*應該*匹配0,它在\ d字符類'[0-9]'中。 – Dylnuge

+0

「1.0e + 3」或「-123.456」怎麼樣?你也想匹配那些嗎? –

回答

17

搜索正,負,和/或小數,你可以使用[+-]?\d+(?:\.\d+)?

>>> nums = re.compile(r"[+-]?\d+(?:\.\d+)?") 
>>> nums.search("0.123").group(0) 
'0.123' 
>>> nums.search("+0.123").group(0) 
'+0.123' 
>>> nums.search("123").group(0) 
'123' 
>>> nums.search("-123").group(0) 
'-123' 
>>> nums.search("1").group(0) 
'1' 

這是不是領導/尾隨零,當然很聰明:

>>> nums.search("0001.20000").group(0) 
'0001.20000' 

編輯:更正了上述正則表達式以查找單位數字。

如果你想添加的指數形式的支持,嘗試[+-]?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?

>>> nums2 = re.compile(r"[+-]?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?") 
>>> nums2.search("-1.23E+45").group(0) 
'-1.23E+45' 
>>> nums2.search("0.1e-456").group(0) 
'0.1e-456' 
>>> nums2.search("1e99").group(0) 
'1e99' 
+2

糾正我,但你的正則表達式不會匹配個位數字? –

+0

啊,很好。我會更新它以使小數後部分可選。 –

+0

+1))對於很酷的修復 –

3

\d應該可以很好地匹配任何非負整數。 \d相當於[0-9](任何單個數字字符),因此它當然不會與負數匹配。在這種情況下,添加一個可選的負號:

\-?\d+ 

\d肯定會匹配0

0

\ d將默認匹配0,所以唯一需要的就是改變你的正則表達式匹配負值,這樣做你可以簡單地使用:

import re 
re.findall(r'[+-]?\d+', ' 1 sd 2 s 3 sfs 0 -1') 

OR

import re 
re.findall(r'(?<!\S)[+-]?\d+(?!\S)', '234 +1 -10 23jjj ssf54 sdg5dfgdf') 
>>> ['234', '+1', '-10'] 
0

要匹配POSITI已經或負數,如-3+5,使用[+-]?\d+

re.findall('[+-]?\d+', 'sfkdjfsdfj-1skjfslkdjf+4') # ['-1', '+4'] 

確保你最後把負號所以編譯器理解你的意思不是別的東西。

0

根據python re documentation,如果未設置UNICODE標誌,\ d會匹配任何數字。如果該標誌被設置,則它匹配在該語言環境中被認爲是數字的任何東西。

它不會沒有一些補充,雖然匹配負數:

-?\d+ 

這工作,但沒有得到任何數字,因爲數字是相當複雜的小東西。 試試這個:

[-+]?\d*\.?\d+([eE][-+]?\d+)? 
相關問題