2011-06-28 70 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+)? 
相关问题