整数的Python正则表达式?

Nik*_*ntz 24 python regex django django-forms

我正在学习reg ex,我想在Python中使用正则表达式来定义整数 - 整数而不是小数.我可以制作一个只允许使用数字\d,但它也允许我不想要的十进制数字:

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

如何将代码更改为仅允许整数?

谢谢

650*_*502 80

正则表达式在字符库上工作,\d意味着单个数字0...... 9而不是十进制数字.

例如,只有整数与符号匹配的正则表达式可以是

^[-+]?[0-9]+$
Run Code Online (Sandbox Code Playgroud)

含义

  1. ^ - 字符串的开头
  2. [-+]?- 可选(这是什么?意思)减号或加号
  3. [0-9]+- 一个或多个数字(加号表示"一个或多个",[0-9]是另一种说法\d)
  4. $ - 字符串结尾

注:具有数字的符号被认为部分是确定只有当你需要解析只是数量.对于处理表达式的更一般的解析器,最好将符号从数字中删除:源流3-2可能最终被解析为两个整数的序列而不是整数,运算符和另一个整数.我的经验是,通过在更高级别上一致折叠一元否定算子可以更好地处理负数.

  • 一个小问题:`\d` 表示任何十进制数字,所以如果你使用 Python 3,它将匹配的不仅仅是 `0`..`9`。例如`re.match("\d", "\u0665")` 将匹配(而且`int("\u0665")` 给出`5`)。 (2认同)
  • 这篇文章是很久以前的文章了,但以防万一新人偶然发现它,从技术上讲,减号是一个运算符(在 Python 3 中),而不是整数的一部分:来自规范:“请注意,数字文字不包含符号;像 -1 这样的短语实际上是由一元运算符“-”和文字 1 组成的表达式 (2认同)

Tim*_*ker 13

您需要将正则表达式锚定在字符串的开头和结尾:

^[0-9]+$
Run Code Online (Sandbox Code Playgroud)

说明:

^      # Start of string
[0-9]+ # one or more digits 0-9
$      # End of string
Run Code Online (Sandbox Code Playgroud)


e-s*_*tis 8

你显然是在使用Django.

你可能最好只使用models.IntegerField()而不是models.TextField().它不仅会为您进行检查,而且会为您提供在多个lang中翻译的错误消息,并且它会将数据库中类型的值透明地转换为Python代码中的类型.


sir*_*ira 7

我更喜欢^[-+]?([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'))
Run Code Online (Sandbox Code Playgroud)