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)
含义
^ - 字符串的开头[-+]?- 可选(这是什么?意思)减号或加号[0-9]+- 一个或多个数字(加号表示"一个或多个",[0-9]是另一种说法\d)$ - 字符串结尾注:具有数字的符号被认为部分是确定只有当你需要解析只是数量.对于处理表达式的更一般的解析器,最好将符号从数字中删除:源流3-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)
你显然是在使用Django.
你可能最好只使用models.IntegerField()而不是models.TextField().它不仅会为您进行检查,而且会为您提供在多个lang中翻译的错误消息,并且它会将数据库中类型的值透明地转换为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'))
Run Code Online (Sandbox Code Playgroud)