[英]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.