检查字符串的正则表达式是整数

时间:2014-06-20 09:33:18

标签: regex python-2.7

HTML表单返回一个由用户输入的数字字符串。如何使用正则表达式来查看它是否能够成为数字。我不是简单地想要删除逗号并查看它是否可以转换为int,也不喜欢locale.atoi方法,因为字符串将对数字进行评估,即使它们是无意义的(例如locale.atoi('01,0,0')求值为100)。

注意,只有字符串包含逗号

时才会出现此验证

重新模式应为:

第一个字符是1-9(不是零) 第2和第3个字符是0-9 然后3位数字1-9和逗号重复0到2次(999,999,999,999是程序中可能的最大数字) 最后是3位数1-9

compiled = re.compile("[1-9][0-9]{0,2},(\d\d\d,){0,2}[0-9]{3}")

未正确匹配字符串的结尾,例如:

re.match(compiled, '123,456,78') 

正在匹配。我做错了什么?

2 个答案:

答案 0 :(得分:1)

如果要匹配完整字符串,请确保在正则表达式中指定stand和end,即:

re.compile(r"^[1-9][0-9]{0,2},(\d\d\d,){0,2}[0-9]{3}$")

另外,正如您将注意到的,我使用了原始字符串(r前缀)来避免转义\

修改

为了解释正则表达式发生了什么,它将匹配的最小子字符串是第一组数字匹配零次,第二组匹配零次:,即"[1-9][0-9]{0},(\d\d\d,){0}[0-9]{3}"[0-9]{3}相同。由于这可以匹配任何字符串,因此可以匹配"123""456"

答案 1 :(得分:1)

更紧凑

我会建议更紧凑的东西:

^[1-9][0-9]{0,2}(?:,[0-9]{3}){0,3}$

请参阅the demo

  • ^声称我们位于字符串的开头
  • [1-9]匹配我们的第一个数字
  • [0-9]{0,2}最多匹配两位数字
  • (?:,[0-9]{3})匹配逗号和三位数字......
  • 介于0到3次之间
  • $断言我们在字符串
  • 的末尾

要验证,您可以这样做:

if re.search("^[1-9][0-9]{0,2}(?:,[0-9]{3}){0,3}$", subject):
    # Successful match
else:
    # Match attempt failed