题目描述
- 请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
- 考点:字符串
解题思路
- 老老实实判断每个字符是否合法
- + - 只能出现在首或者eE的后一位,且+-号后比为数字
- Ee不能放在首尾,且后面必为数字或者+-号
- 小数点只能出现1次,且后面比为数字或为最后位;等
# -*- coding:utf-8 -*-
class Solution:
# s字符串
def isNumeric(self, s):
# write code here
hasE = False # 只能由一个Ee
hasPoint = False # 只能有一个小数点
sign = False # 最多有2个,且第二个只能在eE后
for i in range(len(s)):
if(s[i]=='e' or s[i]=='E'):
if (i == (len(s)-1) or i == 0): # e不能在首尾
return False
if hasE == True: # 如果有两个e,返回fasle
return False
if '.' in s[i+1:]:
return False
hasE = True
elif(s[i] == '+' or s[i] == '-'):
if i == (len(s)-1) : # +-不能在末尾
return False
# 第一次出现,但是不在首,那么比在eE后
if (sign == False) and i>0 and (s[i-1] != 'E' and s[i-1] != 'e'):
return False
# 第二次出现
if (sign == True and (s[i-1] != 'E' and s[i-1] != 'e')):
return False
sign = True
elif s[i] == '.':
if hasPoint == True or i == 0:
return False
hasPoint = True
elif (s[i] < '0' or s[i] > '9'):
return False
return True
- 正则表达式
# -*- coding:utf-8 -*-
class Solution:
# s字符串
def isNumeric(self, s):
# write code here
import re
pattern = re.compile('^[-+]?\\d*(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?$')
return re.match(pattern, s)
转义字符匹配
\d 匹配一个数字,即0-9
\D 匹配一个非数字,即除了0-9
\w 匹配一个单词字符(字母、数字、下划线)
\W 匹配任何非单词字符。等价于[^A-Za-z0-9_]
\s 匹配一个空白符
\S 匹配一个非空白符
\b 匹配单词边界
\B 匹配非单词边界
. 匹配一个任意字符,除了换行符‘\n’和回车符‘\r’
\1 重复子项
量词:对左边的匹配字符定义个数
? 出现零次或一次(最多出现一次)
+ 出现一次或多次(至少出现一次)
* 出现零次或多次(任意次)
{n} 出现n次
{n,m} 出现n到m次
{n,} 至少出现n次
任意一个或者范围
[abc123] : 匹配‘abc123’中的任意一个字符
[a-z0-9] : 匹配a到z或者0到9中的任意一个字符
限制开头结尾
^ 以紧挨的元素开头
$ 以紧挨的元素结尾
- emmmmm...看看字符串能不能转换成float。。【捂脸
# -*- coding:utf-8 -*-
class Solution:
# s字符串
def isNumeric(self, s):
# write code here
try:
float(s)
return True
except:
return False