剑指offer中的一题,请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
import re
s = '12e'
pattern = "[\+-]?[0-9](\.[0-9])?(eE?[0-9]+)?"
if re.match(pattern,s)!=None:
print(‘合法’)
想到用正则来写,不过不熟悉正则,参考的是网上的一个例子,不过没有全部通过测试例。
另,(eE?[0-9]+)?这个表达式的意思是eE?[0-9]+存在有一次或者没有,假设存在,e或者E后面必须要有数字才符合表达,表达式看上似乎是正确,不知道哪里有问题,请指点,谢谢。
我感觉这个写法是不对的。写正则时思路就跟着你的规定走就行了(你没有说清你的规定,我就按自己的规定了):
[\+-]?\d+
。这就是正号可有可无,符号不可省略,可以有若干前导0
的整数。不妨用符号Int
表示这个正则表达式;.
开头的小数部分:Int
加上\.\d+
,即[\+-]?\d+\.\d+
。不妨用符号Float
表示这个正则表达式;.
开头的小数部分可有可无:Int
加上(\.\d+)?
,即[\+-]?\d+(\.\d+)?
。不妨用符号Number
表示这个正则表达式;e
或E
开头,指数必须是整数:Number
(底数)加上[eE]
加上Int
,即[\+-]?\d+(\.\d+)?[eE][\+-]?\d+
。不妨用符号ENumber
表示这个正则表达式;总结:一个合法的数,底数部分必须包含整数部分,其小数部分可有可无;指数部分可有可无,若有,则必须以
e
或E
开头,且指数为先前定义的整数。结果:
[\+-]?\d+(\.\d+)?([eE][\+-]?\d+)?
。最外层的两个(...)?
依次表示“底数部分的小数部分可有可无”和“指数部分可有可无”。如果你要判断而不是匹配,那将输入
trim
后在原先的正则前后分别补上^
和$
。