請實現一個函數用來判斷字符串是否表示數值(包括整數和小數)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示數值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。
方法一:正則表達式匹配
# -*- coding:utf-8 -*-
import re
class Solution:
# s字符串
def isNumeric(self, s):
if re.match(r"^[\+\-]?[0-9]*(\.[0-9]+)?([Ee][\+\-]?[0-9]+)?$", s):
return True
else:
return False
方法二:嘗試轉成float,轉換成功返回True
class Solution:
# s字符串
def isNumeric(self, s):
# write code here
try:
ss = float(s)
print(ss)
return True
except:
return False
方法三:一般判斷解法
# -*- coding:utf-8 -*-
class Solution:
# s字符串
def isNumeric(self, s):
# write code here
if len(s) <= 0:
return False
# 分別標記是否出現過正負號、小數點、e,因爲這幾個需要特殊考慮
has_sign = False
has_point = False
has_e = False
for i in range(len(s)):
# 對於e的情況
if s[i] == 'E' or s[i] == 'e':
# 不同出現兩個e
if has_e:
return False
# e不能出現在最後面,因爲e後面要接數字
else:
has_e = True
if i == len(s) -1:
return False
# 對於符號位的情況
elif s[i] == '+' or s[i] == '-':
# 如果前面已經出現過了符號位,那麼這個符號位,必須是跟在e後面的
if has_sign:
if s[i-1] != 'e' and s[i-1] != 'E':
return False
# 如果這是第一次出現符號位,而且出現的位置不是字符串第一個位置,那麼就只能出現在e後面
else:
has_sign = True
if i > 0 and s[i-1] != 'e' and s[i-1] != 'E':
return False
# 對於小數點的情況
elif s[i] == '.':
# 小數點不能出現兩次;而且如果已經出現過e了,那麼就不能再出現小數點,因爲e後面只能是整數
if has_point or has_e:
return False
# 如果是第一次出現小數點,如果前面出現過e,那麼還是不能出現小數點
else:
has_point = True
if i > 0 and (s[i-1] == 'e' or s[i-1] == 'E'):
return False
else:
# 其他字符必須是‘0’到‘9’之間的
if s[i] < '0' or s[i] > '9':
return False
return True
正則表達式簡單使用:
re.match(r"^[\+\-]?[0-9]*(\.[0-9]+)?([eE][\+\-]?[0-9]+)?$",s)
# re.match() 能夠匹配出以xxx開頭的字符串
# ^ 匹配起始部分
# [\+\-] 匹配+或-號
# ? 匹配0次或1次前面的出現的正則表達式,即要麼只有1次,要麼沒有
# [0-9] 匹配0到9中任意單一字符
# * 匹配0次或多次前面出現的正則表達式,即可有可無
# \. 逐字匹配字符.
# () 標記一個子表達式的開始和結束位置。子表達式可以獲取供以後使用。
# [eE]匹配大寫或者小寫e
# + 匹配1次或者多次前面出現的正則表達式,即至少有1次
# $ 匹配終止部分
# 分解:
# [\+\-]? 一行輸出一個相匹配的+或者-,例如, ++++----輸出在8個行;也可不匹配
# [0-9]* 一行輸出多個相匹配的數字,例如 34543535輸出在一行
# (\.[0-9]+)? 輸出.3242432這種類型的,沒有數字則不輸出
# ([eE][\+\-]?[0-9]+)? 匹配e並且後面爲一個或0個+或者-號再後面必須有至少一個數字
# [\+\-]?[0-9]* 整數部分,其中正負號要麼沒有,要麼只出現一次正負號,整數部分可有可無(.52=0.52)
# (\.[0-9]+)? 小數部分可有可無但是隻能有一次,所以用()?匹配,使用+號表示至少在小數點後出現一個數字,如果沒有匹配項則不輸出;
# 如果用*號,後面如果沒有數字也會輸出一個.號(或許就要看3.算不算數字了,如果3.算數字的話,那麼用*號也可以)
# ([eE][\+\-]?[0-9]+)? 指數部分,可有可無但是隻能有一次,所以用()?匹配;指數形式必須有E或e,e後面的+-號可有可無但是隻能有一次,再後面必須有數字所以用+號