劍指offer:表示數值的字符串 Python3 | 正則表達式 try語句 float()

請實現一個函數用來判斷字符串是否表示數值(包括整數和小數)。例如,字符串"+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後面的+-號可有可無但是隻能有一次,再後面必須有數字所以用+號
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章