[英]Remove double quotes enclosing numbers using regex
我正在使用以下字符串:
'"name": "Gnosis", \n "symbol": "GNO", \n "rank": "99", \n "price_usd": "175.029", \n "price_btc": "0.0186887", \n "24h_volume_usd": "753877.0"'
並且我必須在python中使用re.sub()
來僅替換括在數字中的雙引號( "
),以便稍后在JSON中進行解析。我嘗試了一些正則表達式,但沒有成功。是我最好的嘗試:
exp = re.compile(r': (")\D+\.*\D*(")', re.MULTILINE)
response = re.sub(exp, "", string)
我已經搜索了很多類似的問題,但是還沒有找到另一個類似的問題。
最后,我用了(感謝S. Kablar ):
fomatted = re.sub(r'"(-*\d+(?:\.\d+)?)"', r"\1", string)
parsed = json.loads(formatted)
問題在於此端點返回的格式錯誤的字符串為JSON。
其他用戶用for循環回答 “首先使用json解析字符串,然后將數字轉換為float”,我認為這是一種非常無效的方法,而且,您將不得不在int或float類型之間進行選擇你的回應。 毫無疑問,我已經寫了這個要點 ,向您展示基准測試中不同方法之間的比較,現在,在這種情況下,我將信任正則表達式。
謝謝大家的幫助
首先使用json解析字符串,然后將數字轉換為浮點數:
string = '{"name": "Gnosis", \n "symbol": "GNO", \n "rank": "99", \n "price_usd": "175.029", \n "price_btc": "0.0186887", \n "24h_volume_usd": "753877.0"}'
data = json.loads(string)
response = {}
for key, value in data.items():
try:
value = int(value) if value.strip().isdigit() else float(value)
except ValueError:
pass
response[key] = value
正則表達式 : "(-?\\d+(?:[\\.,]\\d+)?)"
替代 : \\1
細節:
()
捕獲組 (?:)
非捕獲組 \\d
匹配一個數字(等於[0-9]
) +
無限次匹配 ?
零到一匹配 \\1
組1。 Python代碼 :
def remove_quotes(text):
return re.sub(r"\"(-?\d+(?:[\.,]\d+)?)\"", r'\1', text)
remove_quotes('"percent_change_7d": "-23.43"') >> "percent_change_7d": -23.43
你走近了 您要保存數字和冒號,因此需要將其放在括號中,而不要放在括號中。 同樣,數字是\\d
,而不是\\D
(那不是 -numbers)。
所以:
exp = re.compile(r'(: *)"(\d+\.?\d*)"', re.MULTILINE)
response = re.sub(exp, "\\1\\2", string)
\d+\.?\d* means "a number (or more), a point (or not), any numbers"
上面沒有涵蓋“ .125”,這是一個 沒有數字的點。
如果更改為“ \\ d *。?\\ d *”,則它將匹配“。”,因為它是“任意數字”,“一點,任意數字”。
我認為唯一可行的方法是
(\d+\.?\d*|\.\d+)
與| 意思是“或”:因此,可以是一個數字(可選),后跟一個點和任何數字(與“ 17.”匹配), 或者一個點后至少有一個數字。 不幸的是,“ \\ d +。?\\ d +”與“ 5”不匹配。
或者您指定所有三種情況:
(\d+|\d+\.?\d+|\.\d+)
前一個整數(\\ d +),然后是帶有或不帶有小數的浮點數,然后是僅帶有十進制部分且沒有前導零的浮點數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.