如何在Python中定义一个检测字符串是否为十进制数的自定义函数?
实现符合需求的
isdecimal函数 我明白你遇到的问题了——Python自带的str.isnumeric()方法只会对纯数字字符串返回True,像"7.8"这种带小数点的会被直接排除在外。你需要的是一个能识别多种合法十进制格式的函数,包括整数、带小数点的数(哪怕小数点结尾)、负数,甚至科学计数法表示的数,同时还要精准排除那些格式错误的情况。
最简洁且精准的实现方式是使用正则表达式,因为它能清晰定义所有合法字符串的结构规则。
代码实现
import re def isdecimal(s): # 定义匹配合法十进制数的正则模式 decimal_pattern = r'^-?(\d+\.?\d*|\.\d+)([eE][+-]?\d+)?$' # 使用fullmatch检查整个字符串是否完全匹配模式 return bool(re.fullmatch(decimal_pattern, s))
验证测试用例
我们来逐一验证你列出的所有测试场景,确保每个结果都符合预期:
# 测试有效情况 assert isdecimal("8.2") == True assert isdecimal("6.") == True assert isdecimal("5") == True assert isdecimal("-4.") == True assert isdecimal("9e+40") == True assert isdecimal("-4e-4987") == True assert isdecimal("7.3e+18") == True # 测试无效情况 assert isdecimal("8.1.8") == False assert isdecimal("6.2.") == False assert isdecimal(".") == False assert isdecimal("6 8") == False assert isdecimal("foo") == False assert isdecimal("7.3.1e+18") == False assert isdecimal("7.3e+18.5") == False assert isdecimal("1/2") == False print("所有测试用例通过!")
运行这段代码会输出所有测试用例通过!,说明函数完全满足你的需求。
正则模式详解
让我们拆解一下这个正则表达式的各个部分,方便你理解和调整:
^和$:锚定字符串的开头和结尾,确保整个字符串都符合规则,不会出现像"6 8"这种包含空格的无效情况-?:匹配可选的负号,支持负数格式(\d+\.?\d*|\.\d+):这部分匹配数字和小数点的组合,分为两种合法情况:\d+\.?\d*:一个或多个数字开头,后面可以跟一个可选的小数点,再跟可选的数字(覆盖"5"、"6."、"8.2"这类情况)\.\d+:小数点开头,后面跟一个或多个数字(比如".9",如果你的需求需要支持这种格式,这个模式已经包含了它)
([eE][+-]?\d+)?:这部分是可选的科学计数法后缀:[eE]:匹配大小写的e[+-]?:指数部分的正负号是可选的\d+:指数必须是一个或多个整数(排除了像"7.3e+18.5"这种指数带小数点的无效情况)?:整个科学计数部分可以不存在,也就是支持普通的十进制数
内容的提问来源于stack exchange,提问作者Chen-Y0y0
相关产品推荐
相关产品推荐

