使用正则表达式判断字符串是否表示数值

剑指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后面必须要有数字才符合表达,表达式看上似乎是正确,不知道哪里有问题,请指点,谢谢。

阅读 4k
2 个回答

我感觉这个写法是不对的。写正则时思路就跟着你的规定走就行了(你没有说清你的规定,我就按自己的规定了):

  • 不带指数的整数,必须有整数部分,正号可省略:[\+-]?\d+。这就是正号可有可无,符号不可省略,可以有若干前导0的整数。不妨用符号Int表示这个正则表达式;
  • 不带指数的小数,除了必须有整数部分外,还必须有以小数点.开头的小数部分:Int加上\.\d+,即[\+-]?\d+\.\d+。不妨用符号Float表示这个正则表达式;
  • 不带指数的数(整数或小数),必须有整数部分,以.开头的小数部分可有可无:Int加上(\.\d+)?,即[\+-]?\d+(\.\d+)?。不妨用符号Number表示这个正则表达式;
  • 带指数的数(整数或小数),指数部分以eE开头,指数必须是整数:Number(底数)加上[eE]加上Int,即[\+-]?\d+(\.\d+)?[eE][\+-]?\d+。不妨用符号ENumber表示这个正则表达式;

总结:一个合法的数,底数部分必须包含整数部分,其小数部分可有可无;指数部分可有可无,若有,则必须以eE开头,且指数为先前定义的整数。

结果[\+-]?\d+(\.\d+)?([eE][\+-]?\d+)?。最外层的两个(...)?依次表示“底数部分的小数部分可有可无”和“指数部分可有可无”。

如果你要判断而不是匹配,那将输入trim后在原先的正则前后分别补上^$

^[-+]?(?:[1-9]\d*|0)(?:\.\d+)?(?:[eE][-+]?\d+)?$
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题