Python正則如何匹配浮點數?各種格式處理

要全面匹配python中各種格式的浮點數,需考慮基礎格式、科學計數法及正負號等要素。1. 基礎格式包括整數和小數部分組合,如123.456、.789或0.0,正則應支持可選符號、可省略的整數或小數點部分,但需避免匹配非法值如“.”;2. 科學計數法格式如123e5或-1.2e-3,需添加非捕獲組(?:ee?d+)?以匹配指數部分;3. 完整正則表達式為r’^[-+]?(d+.d*|.d+|d+)(?:ee?d+)?$’,涵蓋所有合法格式并確保完整匹配;4. 實際使用時可根據需求調整,如排除純整數、處理多數值行或提取全部匹配項,并注意分組與錨定符的使用。

Python正則如何匹配浮點數?各種格式處理

匹配浮點數是python正則表達式中一個常見但容易出錯的任務。因為浮點數有多種格式,比如帶小數點的、科學計數法表示的、正負號開頭的等等。如果只寫一種簡單的模式,很容易漏掉一些合法形式。

Python正則如何匹配浮點數?各種格式處理

要全面匹配各種格式的浮點數,需要考慮以下幾個方面:

Python正則如何匹配浮點數?各種格式處理


1. 基礎格式:整數和小數部分組合

浮點數最基本的格式就是由整數部分、小數點和小數部分組成。例如:123.456 或 .789(以小數點開頭)或 0.0 等。

立即學習Python免費學習筆記(深入)”;

對應正則可以這樣寫:

Python正則如何匹配浮點數?各種格式處理

r'[-+]?[0-9]*.?[0-9]+'

說明:

  • [-+]? 表示可選的正負號
  • [0-9]* 表示整數部分可有可無(支持.789這種寫法)
  • .? 表示小數點可有可無(不過為了確保是浮點數,最好保留)
  • [0-9]+ 表示小數部分必須存在

不過這個正則也有問題,比如會匹配類似 . 這種非法值,所以需要更精確。


2. 支持科學計數法(e/E 后面跟整數)

像 123e5、-1.2E-3 這樣的格式也屬于合法浮點數。

這部分可以這樣補充:

(?:[eE][-+]?[0-9]+)?

解釋:

  • (?:…) 是非捕獲組,不影響整體結構
  • 匹配 e 或 E 開頭的指數部分
  • 指數部分也可以有正負號,如 -3 或 +4
  • 指數必須是整數(不能是小數)

把這部分加到前面的正則后面,就形成了完整的浮點數匹配邏輯。


3. 完整正則表達式及使用方式

綜合上面兩個部分,完整正則如下:

r'^[-+]?([0-9]+.[0-9]*|.[0-9]+|[0-9]+)(?:[eE][-+]?[0-9]+)?$'

說明一下各部分含義:

  • ^…$ 表示從頭到尾完全匹配,防止匹配到中間非法字符
  • ([0-9]+.[0-9]*|.[0-9]+|[0-9]+) 表示三種合法的小數格式:
    • 數字.數字,如 123.456
    • .數字,如 .789
    • 純整數,如 123(這種情況可能會超出“浮點”范圍,但有些場景也需要包含)

這個正則可以覆蓋大多數標準浮點數格式,包括:

  • 123.456
  • .789
  • 123
  • -123.45e67
  • +0.123E-45

4. 實際使用建議與注意事項

在實際使用中,有幾個細節需要注意:

  • 如果你只想匹配“真正的小數”,那應該排除純整數的情況(即去掉最后的 | [0-9]+ 部分)
  • 如果你的輸入可能包含多個數值在同一行,去掉 ^ 和 $ 錨定符
  • 如果想提取字符串中的所有浮點數,可以用 re.findall() 方法

舉個例子:

import re  text = "這里有幾個數:123.45, .67, -89.0E-2, +1.2E3 和 789" pattern = r'[-+]?([0-9]+.[0-9]*|.[0-9]+)(?:[eE][-+]?[0-9]+)?'  matches = re.findall(pattern, text) print(matches)  # 輸出結果包含符合格式的部分

注意:上面這個例子中,由于用的是 findall,而我們用了分組(括號),所以輸出的是第一個捕獲組的內容,不一定準確。如果你只是要整個匹配項,記得使用非捕獲組或者調整括號結構。


基本上就這些了。寫正則匹配浮點數不復雜,但要處理各種格式確實容易遺漏。只要根據具體需求靈活調整正則結構,就能滿足大部分場景。

? 版權聲明
THE END
喜歡就支持一下吧
點贊5 分享