Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
整数的Python正则表达式?_Python_Regex_Django_Django Forms - Fatal编程技术网

整数的Python正则表达式?

整数的Python正则表达式?,python,regex,django,django-forms,Python,Regex,Django,Django Forms,我正在学习正则表达式,我想用Python中的正则表达式只定义整数——整数而不是小数 我可以使用\d制作一个只允许数字的,但它也允许十进制数字,我不想要: price = TextField(_('Price'), [ validators.Regexp('\d', message=_('This is not an integer number, please see the example and try again')), validators.Optional()])

我正在学习正则表达式,我想用Python中的正则表达式只定义整数——整数而不是小数

我可以使用
\d
制作一个只允许数字的,但它也允许十进制数字,我不想要:

price = TextField(_('Price'), [
    validators.Regexp('\d', message=_('This is not an integer number, please see the example and try again')),
    validators.Optional()]) 
如何将代码更改为仅允许整数?

您需要在字符串的开头和结尾添加正则表达式:

^[0-9]+$
说明:

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

Regexp在字符基上工作,
\d
表示一个单位数
0
9
,而不是十进制数

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

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

  • ^
    -字符串的开头
  • [-+]?
    -可选的减号或加号(这就是
    的意思)
  • [0-9]+
    -一个或多个数字(加号表示“一个或多个”,而
    [0-9]
    是表示
    \d
    的另一种方式)
  • $
    -字符串结尾

  • 注意:只有当您只需要解析数字时,才可以将符号视为数字的一部分。对于处理表达式的更通用的解析器,最好将符号从数字中去掉:像
    3-2
    这样的源流可能会被解析为两个整数的序列,而不是整数、运算符和另一个整数。我的经验是,通过在更高级别上不断折叠一元否定运算符,负数可以更好地处理。

    您显然在使用Django

    您最好只使用
    models.IntegerField()
    而不是
    models.TextField()
    。它不仅会为您执行检查,还会将错误消息翻译成几个语言,并将值从数据库中的类型透明地转换为Python代码中的类型。

    我更喜欢
    ^[-+]([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'))
    

    这不允许负整数。。。不确定OP是否想要避免them@6502:好的,因为它是对价格文本字段的验证,我认为正整数更有意义,但对于您的评论良好的答案仍然是+1:)实际上正整数对价格文本字段没有多大意义,除非价格是以美分为单位。@wim:Nick明确要求整数——这就是问题的关键所在。这就像价格,但只以美元为单位。这是一个分类广告发布网站,所有的广告都是以美元为单位,而不是以美分为单位。对于像一个小点这样的问题是金色的:
    \d
    表示任何十进制数字,因此如果您使用的是Python 3,它将匹配的不仅仅是
    0
    9
    。e、 g.
    re.match(“\d”,“\u0665”)
    将匹配(以及
    int(“\u0665”)
    给出的
    5
    )。这篇文章是很久以前的事了,但如果有新人偶然发现它,从技术上讲减号是一个运算符(在Python 3中),而不是整数的一部分:从规范:“请注意,数字文字不包括符号;像-1这样的短语实际上是一个由一元运算符“-”和文字1“@en_Knight:这在我看来完全不相关。OP要求的是一个表达式,用于接受人类的整数,而不是Python 3。虽然有一个“价格”“可能只适用于非负数,例如,接受负整数作为“价差”很有意义”。。。甚至在使用Python 3编写会计程序时。一些语法将整数定义为+或-后跟一个或多个数字,^[+\-]?[0-9]+$@ChuckCottrill:添加了
    +
    符号(在解析时不太常见,但在格式化时确实有些常见)。我还添加了一个注释,说明为什么在解析一个更复杂的解析器能够处理表达式时,考虑解析时的符号部分是一个坏主意。