這似乎是一個相當簡單的問題,但我無法讓它發揮作用。
我有一個文本檔案,其中包含類似 JSON 的資料,但還有幾行額外的行,阻止它成為有效的 JSON,我需要洗掉這些行。這聽起來非常簡單,甚至更簡單,因為有效的 JSON 字串(我可以稍后決議)始終包含在以下容器中:
xyz()
例如,資料集將類似于:
abcdefg
xyz({"id_value": 123, "text_value": "efg"})
abcdefg
xyz({"id_value": 124, "text_value": "hij"})
每個單獨的 JSON 字串總是以 abcdefg 為前綴,然后是 xyz( 并且后面總是有一個右括號。所以格式是一致的。
我正在嘗試以下操作:
re.findall(r'xyz\(.*?\)', text_file)
然而,盡管嘗試了這種變化(例如使用 re.search,嘗試 \w 等)似乎沒有任何效果(我的意思是它回傳一個空串列)。
如果我只是嘗試執行以下操作:
re.findall(r'xyz\(
然后它回傳:
['xyz(', 'xyz(']
正如預期的那樣。
所以問題似乎與括號中的字串有關,但我無法弄清楚問題是什么,因為這里的其他示例表明我的代碼是正確的(它不可能是因為它不起作用)!
我認為它的東西非常簡單,但我有點卡住了!
uj5u.com熱心網友回復:
您可以regex通過運行pip install regex(或pip3 install regex)來安裝 PyPi模塊,然后使用此庫來匹配xyz(下一個配對)字符之間的字串,使用:
import regex
#...
output = [x.group() for x in regex.finditer(r'xyz(\((?:[^()] |(?1))*\))', text_file)
串列推導式用于避免regex.findall在正則運算式中定義捕獲組時僅回傳捕獲的子字串的問題(這里,括號周圍的捕獲組是必需的,因為它在模式內使用(?1)子例程遞回。
圖案詳情:
xyz-xyz文字(\((?:[^()] |(?1))*\))- 第 1 組:\(- 一個(字符(?:[^()] |(?1))*- 除(和)或子程式重復(遞回)整個第 1 組模式之外的一個或多個字符的零次或多次重復\)- 一個)字符。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/354310.html
上一篇:我需要在某種模式之間保留任何東西
