整数的Python正则表达式?
Posted
技术标签:
【中文标题】整数的Python正则表达式?【英文标题】:Python regex for integer? 【发布时间】:2012-01-25 01:26:12 【问题描述】:我正在学习正则表达式,我想在 Python 中使用正则表达式来仅定义整数 - 整数而不是小数。
我可以使用\d
制作一个只允许数字的数字,但它也允许十进制数字,这是我不想要的:
price = TextField(_('Price'), [
validators.Regexp('\d', message=_('This is not an integer number, please see the example and try again')),
validators.Optional()])
如何将代码更改为仅允许整数?
【问题讨论】:
regexlib.com 是解决此类问题的金子 【参考方案1】:正则表达式以字符为基础工作,\d
表示单个数字 0
...9
而不是十进制数。
只匹配带符号的整数的正则表达式可以是例如
^[-+]?[0-9]+$
意义
^
- 字符串开头
[-+]?
- 可选(这是?
的意思)减号或加号
[0-9]+
- 一个或多个数字(加号表示“一个或多个”,[0-9]
是\d
的另一种说法)
$
- 字符串结束
注意:仅当您需要解析仅数字时,才可以将符号视为数字的一部分。对于处理表达式的更通用的解析器,最好将符号留在数字之外:像3-2
这样的源流最终可能会被解析为两个整数的序列,而不是一个整数、一个运算符和另一个整数。我的经验是,负数可以通过在更高级别上不断折叠一元否定运算符来更好地处理。
【讨论】:
一个小问题:\d
表示任何十进制数字,因此如果您使用 Python 3,它将匹配的不仅仅是 0
..9
。例如re.match("\d", "\u0665")
将匹配(int("\u0665")
也将匹配 5
)。
这篇文章来自很久以前,但如果有人偶然发现它,从技术上讲,减号是一个运算符(在 Python 3 中),而不是整数的一部分:来自规范:“请注意,数字文字不包含符号;像 -1 这样的短语实际上是由一元运算符 '-' 和文字 1" 组成的表达式
@en_Knight:这与 IMO 完全无关。 OP 要求的是一个接受整数的表达式人类,而不是 Python 3。虽然有一个“价格”可能只符合非负数的条件,例如它可以赚很多有意义地接受负整数作为“价格差异”......即使使用 Python 3 编写该会计程序。
一些语法将整数定义为 + 或 - 后跟一个或多个数字,^[+\-]?[0-9]+$
@ChuckCottrill:添加了+
符号(在解析时并不常见,但在格式化时确实有些常见)。我还添加了一条注释,说明为什么如果您的目标是能够处理表达式的更复杂的解析器,那么在解析时考虑数字的符号部分是一个坏主意。【参考方案2】:
你需要anchor字符串开头和结尾的正则表达式:
^[0-9]+$
说明:
^ # Start of string
[0-9]+ # one or more digits 0-9
$ # End of string
【讨论】:
这不允许负整数...不确定 OP 是否想避免它们 @6502:好吧,因为它是对价格文本字段的验证,所以我认为正整数更有意义,但对于您的好评回答仍然 +1 :) 实际上正整数对于价格文本字段没有多大意义,除非价格以美分为单位.. @wim:尼克明确要求整数 - 这就是问题的全部意义所在。 这就像一个价格,但只有美元。这是一个分类广告发布网站,在该网站上,所有广告都以美元为单位,而没有以美分为单位。【参考方案3】:你显然在使用 Django。
您最好只使用models.IntegerField()
而不是models.TextField()
。它不仅会为您进行检查,还会为您提供翻译成多种语言的错误消息,并将值从数据库中的类型透明地转换为 Python 代码中的类型。
【讨论】:
【参考方案4】:我更喜欢^[-+]?([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'))
【讨论】:
【参考方案5】:import re
num="12.345678"
y = re.findall('\.[0-9.]+',num)
print(y)
答案= ['.345678']
之后,您可以将字符串转换为浮点数。
【讨论】:
以上是关于整数的Python正则表达式?的主要内容,如果未能解决你的问题,请参考以下文章