表示数值的字符串

题目描述

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。

思路:

分几种情况,括号代表可选
整数 A:(+-)A
小数部分B:(A).B
小数+指数,指数部分C:(A).B e(E)(+-)C
整数+指数:(+-)A e(E) (+-)C
除去.+-eE,ABC都是整数
.和e(E)后面必须有数字
e,E前面必须有数字

编程实现:

python 代码1
 1 # -*- coding:utf-8 -*-
 2 class Solution:
 3     # s字符串
 4     def isNumeric(self, s):
 5         # write code here
 6         if len(s)==0:
 7             return False
 8         i = 0
 9         if s[i]=='+' or s[i]=='-':
10             i += 1
11         # 整数
12         for j in range(i,len(s),1):
13             if s[j]>='0' and s[j]<='9':
14                 continue        
15             if s[j]=='.':
16                 # 进入小数判别:.前面可以没整数
17                 return self.isfloat(s[j+1:])
18             if s[j] == 'e' or s[j]=='E'  and j!=i:
19                 #进入指数判别:e前面需要有整数,e后面可以有无+-
20                 if j+1 >=len(s): # 需要判断j+1是否有效
21                     return False
22                 if s[j+1]=='+' or s[j+1]=='-':
23                     j = j+1  
24                 return self.isinteger(s[j+1:])
25             else:
26                 return False 
27         return True # 只是整数
28     def isfloat(self,s):
29         # 小数后面可能加指数
30         if len(s)==0:
31             return False
32         for j in range(len(s)):
33             if s[j]>='0' and s[j]<='9':
34                 continue        
35             if s[j] == 'e' or s[j]=='E'  and j!= 0:
36                 #进入指数判别:e前面需要有整数,e后面可以有无+-
37                 if j+1 >=len(s): # e后面需要有整数
38                     return False
39                 if s[j+1]=='+' or s[j+1]=='-':
40                     j = j+1
41                 return self.isinteger(s[j+1:])
42             else:
43                 return False 
44         return True # 只是小数     
45     def isinteger(self,s):
46         if len(s) ==0:
47             return False
48         for i in s:
49             if i>='0' and i<='9':
50                 continue
51             else:
52                 return False
53         return True
54         
55             

代码2

使用正则表达式

1 # -*- coding:utf-8 -*-
2 import re
3 class Solution:
4     # s字符串
5     def isNumeric(self, s):
6         return re.match(r"^[+-]?[0-9]*(.[0-9]*)?([eE][+-]?[0-9]+)?$",s)
7         # 或者如以下代码
8        # import re
9         #return re.match(r"^[+-]?[0-9]*(.[0-9]*)?([eE][+-]?[0-9]+)?$",s)

其中

^ 匹配字符串的开头
$ 匹配字符串的末尾。
re* 匹配0个或多个的表达式。
re+ 匹配1个或多个的表达式。
re? 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式
原文地址:https://www.cnblogs.com/shuangcao/p/12868411.html