正则表达式,找到字符串中的任意数字
搜索正,负,和/或小数,你可以使用[+-]?\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'
纠正我,但你的正则表达式不会匹配个位数字? –
啊,很好。我会更新它以使小数后部分可选。 –
+1))对于很酷的修复 –
\d
应该可以很好地匹配任何非负整数。 \d
相当于[0-9]
(任何单个数字字符),因此它当然不会与负数匹配。在这种情况下,添加一个可选的负号:
\-?\d+
\d
肯定会匹配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']
要匹配POSITI已经或负数,如-3
或+5
,使用[+-]?\d+
:
re.findall('[+-]?\d+', 'sfkdjfsdfj-1skjfslkdjf+4') # ['-1', '+4']
确保你最后把负号所以编译器理解你的意思不是别的东西。
根据python re documentation,如果未设置UNICODE标志,\ d会匹配任何数字。如果该标志被设置,则它匹配在该语言环境中被认为是数字的任何东西。
它不会没有一些补充,虽然匹配负数:
-?\d+
这工作,但没有得到任何数字,因为数字是相当复杂的小东西。 试试这个:
[-+]?\d*\.?\d+([eE][-+]?\d+)?
试试'r“ - ?\ d +”'。编辑: - 不需要在'[]'外面转义' – Evpok
正则表达式不会根据它们的内容来读取事物,而是根据它们在什么字符类中进行读取,因此您需要一个可选的“ - ”字符来匹配负值。也就是说,\ d +绝对*应该*匹配0,它在\ d字符类'[0-9]'中。 – Dylnuge
“1.0e + 3”或“-123.456”怎么样?你也想匹配那些吗? –