Python 正则表达式匹配整数?
我正在学习正则表达式(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
表示一个数字,范围是0
到9
,而不是小数。
一个只匹配带符号整数的正则表达式可以是:
^[-+]?[0-9]+$
这个表达式的意思是:
^
- 字符串的开始[-+]?
- 一个可选的符号(这里的?
表示可选),可以是负号或正号[0-9]+
- 一个或多个数字(加号表示“一个或多个”,而[0-9]
是表示数字的另一种方式)$
- 字符串的结束
注意:如果你只需要解析数字本身,那么把符号当作数字的一部分是可以的。但如果是更通用的解析器处理表达式,最好把符号单独处理:像3-2
这样的输入可能会被解析成两个整数,而不是一个整数、一个运算符和另一个整数。根据我的经验,负数在更高层次上通过常量折叠的方式处理会更好。