簡體   English   中英

您如何將這些組與 Python 正則表達式匹配?

[英]How do you match these groups with Python regex?

我有一個奇怪的情況,這個簡單的代碼沒有按預期運行:

import re

text = 'This Level: 75.3'
matches = re.search(r'(?:(?:\d{1,3},)(?:\d{3},)*(?:\d{3})|\d*)(?:\.\d+)?', text)

print(matches.match)

我不斷返回一個空白字符串......但是,我希望這是75.3 這適用於其他用例,例如:

assert util.strip_str_to_float('7') == 7.0
assert util.strip_str_to_float('75') == 75.0
assert util.strip_str_to_float('75.5') == 75.5
assert util.strip_str_to_float('7.7.9') == 7.7
assert util.strip_str_to_float('1,298.3 Gold') == 1298.3

最終,我試圖從給定的字符串中提取並轉換第一個浮點數......我沒想到這個測試用例會失敗。 當匹配不是從字符串的開頭開始時,它似乎特別失敗。 如果我刪除非捕獲組,搜索似乎工作正常,例如,這有效:

matches = re.search(r'\d*\.\d+', text)

但這不會:

matches = re.search(r'\d*(?:\.\d+)?', text)

有任何想法嗎...?

看起來您允許沒有小數部分的純整數以及沒有整數部分的小數(如“.5”)。 這很好,但是由於這兩個部分都是可選的,所以當兩個部分都不存在時,您也會進行匹配,因此您會得到很多空的 0 長度匹配項。

這也是您的模式r'\d*\.\d+'起作用的原因,因為需要小數點。

pattern = r'\d{1,3}(?:,\d{3})*(?:\.\d+)?|\.\d+'

如果我正確理解了這個問題,那么這種模式應該可以工作。 它分為兩部分,因此它查找以下任一部分:

  • 帶有可選小數部分的整數,或
  • 必需的小數部分,前面沒有整數

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM