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')
正在匹配。我做错了什么?
答案 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})
匹配逗号和三位数字...... $
断言我们在字符串要验证,您可以这样做:
if re.search("^[1-9][0-9]{0,2}(?:,[0-9]{3}){0,3}$", subject):
# Successful match
else:
# Match attempt failed