题目
题目描述
给定一个字符串 s ,返回 s 是否是一个 有效数字。
例如,下面的都是有效数字:“2”, “0089”, “-0.1”, “+3.14”, “4.”, “-.9”, “2e10”, “-90E3”, “3e+7”, “+6e-1”, “53.5e93”, “-123.456e789”,而接下来的不是:“abc”, “1a”, “1e”, “e3”, “99e2.5”, “–6”, “-+3”, “95a54e53”。
一般的,一个 有效数字 可以用以下的规则之一定义:
一个 整数 后面跟着一个 可选指数。
一个 十进制数 后面跟着一个 可选指数。
一个 整数 定义为一个 可选符号 ‘-’ 或 ‘+’ 后面跟着 数字。
一个 十进制数 定义为一个 可选符号 ‘-’ 或 ‘+’ 后面跟着下述规则:
数字 后跟着一个 小数点 .。
数字 后跟着一个 小数点 . 再跟着 数位。
一个 小数点 . 后跟着 数位。
指数 定义为指数符号 ‘e’ 或 ‘E’,后面跟着一个 整数。
数字 定义为一个或多个数位。
示例 1:
输入:s = “0”
输出:true
示例 2:
输入:s = “e”
输出:false
示例 3:
输入:s = “.”
输出:false
提示:
1 <= s.length <= 20
s 仅含英文字母(大写和小写),数字(0-9),加号 ‘+’ ,减号 ‘-’ ,或者点 ‘.’ 。
题解
思路分析
为了判断一个字符串是否为有效数字,我们可以使用正则表达式(regex)来匹配上述规则。通过构造一个合适的正则表达式,可以有效地验证字符串是否符合有效数字的定义。
正则表达式的构建
根据题目描述的有效数字规则,我们可以逐步构建正则表达式:
-
整数部分:
[+-]?(\d+)- 可选符号
[+-]? - 一个或多个数字
(\d+)
- 可选符号
-
十进制数部分:
- 形式1:
[+-]?(\d+\.) - 形式2:
[+-]?(\d+\.\d*) - 形式3:
[+-]?(\.\d+)
- 形式1:
-
指数部分:
(e|E)[+-]?(\d+)- 指数符号
(e|E) - 可选符号
[+-]? - 一个或多个数字
(\d+)
- 指数符号
-
组合:将整数和十进制数部分与指数部分组合起来。
最终的正则表达式可以写成:
^[+-]?(\d+(\.\d*)?|\.\d+)([eE][+-]?\d+)?$
Python 实现代码
import re
def isNumber(s: str) -> bool:
# 定义正则表达式
pattern = r"^[+-]?(\d+(\.\d*)?|\.\d+)([eE][+-]?\d+)?$"
# 使用正则表达式匹配字符串
return bool(re.match(pattern, s.strip()))
代码解释
-
正则表达式解释:
^[+-]?:匹配字符串开头的可选符号'+'或'-'。(\d+(\.\d*)?|\.\d+):匹配整数或十进制数部分。\d+(\.\d*)?:匹配整数后跟可选的小数部分。\.\d+:匹配小数点后跟一个或多个数字。
([eE][+-]?\d+)?$:匹配可选的指数部分,包括指数符号'e'或'E',可选符号'+'或'-',以及一个或多个数字。
-
函数实现:
isNumber函数首先定义了一个正则表达式模式pattern。- 然后使用
re.match函数检查字符串s是否完全匹配这个模式。注意这里使用了strip()方法去除字符串两端的空白字符,以确保不会因为多余的空格影响匹配结果。 - 最终返回匹配结果的布尔值。
这种方法利用了正则表达式的强大功能,简洁且高效地实现了对字符串是否为有效数字的判断。
提交结果


被折叠的 条评论
为什么被折叠?



