Python 正则表达式匹配整数?

44 投票
5 回答
222093 浏览
提问于 2025-04-17 08:45

我正在学习正则表达式(regex),想在Python中使用正则表达式来定义只允许整数,也就是不带小数的完整数字。

我可以用 \d 来写一个只允许数字的表达式,但这样的话也会允许小数,这不是我想要的:

price = TextField(_('Price'), [
    validators.Regexp('\d', message=_('This is not an integer number, please see the example and try again')),
    validators.Optional()]) 

我该怎么修改代码,才能允许整数呢?

5 个回答

10

我更喜欢 ^[-+]?([1-9]\d*|0)$ 这个写法,因为 ^[-+]?[0-9]+$ 这个写法允许字符串以 0 开头。

RE_INT = re.compile(r'^[-+]?([1-9]\d*|0)$')


class TestRE(unittest.TestCase):
    def test_int(self):
        self.assertFalse(RE_INT.match('+'))
        self.assertFalse(RE_INT.match('-'))

        self.assertTrue(RE_INT.match('1'))
        self.assertTrue(RE_INT.match('+1'))
        self.assertTrue(RE_INT.match('-1'))
        self.assertTrue(RE_INT.match('0'))
        self.assertTrue(RE_INT.match('+0'))
        self.assertTrue(RE_INT.match('-0'))

        self.assertTrue(RE_INT.match('11'))
        self.assertFalse(RE_INT.match('00'))
        self.assertFalse(RE_INT.match('01'))
        self.assertTrue(RE_INT.match('+11'))
        self.assertFalse(RE_INT.match('+00'))
        self.assertFalse(RE_INT.match('+01'))
        self.assertTrue(RE_INT.match('-11'))
        self.assertFalse(RE_INT.match('-00'))
        self.assertFalse(RE_INT.match('-01'))

        self.assertTrue(RE_INT.match('1234567890'))
        self.assertTrue(RE_INT.match('+1234567890'))
        self.assertTrue(RE_INT.match('-1234567890'))
16

你需要在字符串的开头和结尾加上“锚点”来使用正则表达式:

^[0-9]+$

解释:

^      # Start of string
[0-9]+ # one or more digits 0-9
$      # End of string
115

正则表达式是基于字符的,\d表示一个数字,范围是09,而不是小数。

一个只匹配带符号整数的正则表达式可以是:

^[-+]?[0-9]+$

这个表达式的意思是:

  1. ^ - 字符串的开始
  2. [-+]? - 一个可选的符号(这里的?表示可选),可以是负号或正号
  3. [0-9]+ - 一个或多个数字(加号表示“一个或多个”,而[0-9]是表示数字的另一种方式)
  4. $ - 字符串的结束

注意:如果你只需要解析数字本身,那么把符号当作数字的一部分是可以的。但如果是更通用的解析器处理表达式,最好把符号单独处理:像3-2这样的输入可能会被解析成两个整数,而不是一个整数、一个运算符和另一个整数。根据我的经验,负数在更高层次上通过常量折叠的方式处理会更好。

撰写回答