答案很大程度上取決於'數字串'的含義。如果數字字符串的定義是「任何可以接受的東西」,那麼很難改進try-except方法。
但請記住,浮動可能比您想要的更加自由:在大多數機器上,它會接受代表無窮大和nans的字符串。例如,在我的機器上,它接受'nan(dead!$#parrot)'
。它也將接受前導空白和尾隨空白。取決於您的應用程序,您可能希望排除浮點數的指數表示。在這些情況下,使用正則表達式是有道理的。爲了排除infinities和nans,使用try-except方法可能會更快,然後使用math.isnan和math.isinf來檢查轉換結果。
爲數字字符串編寫正確的正則表達式是一個令人驚訝的容易出錯的任務。例如,您的IsNumber2
函數接受字符串'.'
。您可以在十進制模塊源中找到經過測試的數字字符串正則表達式版本。這是(有一些小修改):
_parser = re.compile(r""" # A numeric string consists of:
(?P<sign>[-+])? # an optional sign, followed by either...
(
(?=\d|\.\d) # ...a number (with at least one digit)
(?P<int>\d*) # having a (possibly empty) integer part
(\.(?P<frac>\d*))? # followed by an optional fractional part
(E(?P<exp>[-+]?\d+))? # followed by an optional exponent, or...
|
Inf(inity)? # ...an infinity, or...
|
(?P<signal>s)? # ...an (optionally signaling)
NaN # NaN
(?P<diag>\d*) # with (possibly empty) diagnostic info.
)
\Z
""", re.VERBOSE | re.IGNORECASE | re.UNICODE).match
這幾乎場比賽正是浮接受,除了開頭和結尾的空白和NaN的一些細微的差別(多餘的「S」的信號NaN,和診斷信息)。當我需要一個數字正則表達式時,我通常從這個開始,編輯出我不需要的位。
N.B.這是可以想象浮點數可能比正則表達式慢,因爲它不僅要解析字符串,還要把它變成一個浮點數,這是一個相當複雜的計算;但如果是這樣,它仍然會是一個驚喜。
第一種方法是正確且有用的。第二個是間接的,有多個微妙的錯誤。 –
@Mike Graham:您的評論聽起來像是一個答案。請刪除評論,發佈答案,然後我們可以正確地對其進行修改。 –
你的正則表達式中的另一個錯誤:你需要逃避那個。之前 ?除非你想123z45被視爲「一個數字」。 –