整数的Python正则表达式?
我正在学习正则表达式,我想用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()])
\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:添加了+
符号(在解析时不太常见,但在格式化时确实有些常见)。我还添加了一个注释,说明为什么在解析一个更复杂的解析器能够处理表达式时,考虑解析时的符号部分是一个坏主意。