簡體   English   中英

使用正則表達式刪除包含數字的雙引號

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

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