查找字符串中任意数字的正则表达式

16 投票
6 回答
46547 浏览
提问于 2025-04-16 20:27

在正则表达式中,表示任何数字的符号是什么呢?

比如说,如果我想在一个字符串中查找任何数字,无论是正数还是负数。

我之前用的是 \d+,但是这样找不到 0 或者 -1。

6 个回答

3

要匹配正数或负数,比如 -3+5,可以使用 [+-]?\d+ 这个表达式:

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

记得把负号放在最后,这样编译器才能明白你不是在说别的意思。

4

\d 可以用来匹配任何非负整数。\d 的意思和 [0-9] 是一样的,也就是匹配任何一个数字字符,所以它自然不会匹配负数。如果你想匹配负数,可以在前面加一个可选的负号:

\-?\d+

\d 肯定会匹配到 0

27

如果你想找正数、负数或者小数,可以用这个表达式 [+-]?\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'

撰写回答