整数的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正则表达式?的主要内容,如果未能解决你的问题,请参考以下文章

Python常用正则表达式总结

正则表达式删去双引号vscode

LeetCode:8. 字符串转换整数(python3)

大于等于0的正整数正则表达式是啥?

Python常用正则表达式

如何用正则表达式限制只输入整数(包括负整数和0)