嗨有以下字串:
s = r'aaa (bbb (ccc)) ddd'
我想找到最里面的嵌套括號并將其替換為{}. 想要的輸出:
s = r'aaa (bbb {ccc}) ddd'
讓我們從嵌套的(. 我使用以下正則運算式來查找嵌套括號,效果很好:
match = re.search(r'\([^\)] (\()', s)
print(match.group(1))
(
然后我嘗試進行替換:
re.sub(match.group(1), r'\{', s)
但我收到以下錯誤:
error: missing ), unterminated subpattern at position 0
我真的不明白怎么了。
uj5u.com熱心網友回復:
您可以使用
import re
s = r'aaa (bbb (ccc)) ddd'
print( re.sub(r'\(([^()]*)\)', r'{\1}', s) )
# => aaa (bbb {ccc}) ddd
請參閱Python 演示。
詳情:
\(- 一個(字符([^()]*)- 第 1 組 ( ):除and\1之外的任何零個或多個字符()\)- 一個)字符。
替換是用花括號包裹的第 1 組值。
uj5u.com熱心網友回復:
使用您展示的示例和嘗試,請嘗試使用 Python3.x 撰寫和測驗的以下 Python 代碼。另外這里是代碼中使用的正則運算式的在線演示。
import re
var = r'aaa (bbb (ccc)) ddd'
print( re.sub(r'(^.*?\([^(]*)\(([^)]*)\)(.*)', r'\1{\2}\3', var) )
所示樣本的輸出如下:
aaa (bbb {ccc}) ddd
Python代碼說明:
- 在此處使用 python 的
re庫進行正則運算式。 - 創建一個名為的變數
var,其中包含值aaa (bbb (ccc)) ddd。 - 然后使用
printpython3 的函式來列印我們從re.sub函式中獲得的值,該函式正在為我們執行替換以獲得所需的輸出。
部分說明re.sub:基本上我們使用正則運算式(^.*?\([^(]*)\(([^)]*)\)(.*)(如下所述),它創建 3 個捕獲組(僅用于獲取所需的值),其中第一個捕獲組捕獲之前(存在的ccc,第二個捕獲組ccc在其中,第三個捕獲組有其余的價值在里面。在執行替換時,我們只是將其替換為\1{\2}\3并將值包裝ccc在{..}
正則運算式的解釋:
(^.*?\([^(]*) ##Creating 1st capturing group which matches values from starting of value to till first occurrence of (
##with a Lazy match followed by a match which matches anything just before next occurrence of (
\( ##Matching literal ( here, NO capturing group here as we DO NOT want this in output.
([^)]*) ##Creating 2nd capturing group which has everything just before next occurrence of ) in it.
\) ##Matching literal ) here, NO capturing group here as we DO NOT want this in output.
(.*) ##Creating 3rd capturing group which has rest values in it.
uj5u.com熱心網友回復:
你弄錯了引數順序:
子(模式,repl,字串,計數=0,標志=0)
回傳通過替換 repl 替換 string 中模式的最左側非重疊出現而獲得的字串。repl 可以是字串或可呼叫物件;如果是字串,則處理其中的反斜杠轉義。如果它是可呼叫的,它會傳遞 Match 物件,并且必須回傳要使用的替換字串。
模式首先出現,但是因為您已經給出了它match.group(1),所以它被'('視為模式,其中包含不匹配和非轉義的括號。
我認為您所追求的是:
re.sub(r'\([^\)] (\()', r'\1{', s)
'aaa ({ccc)) ddd'
uj5u.com熱心網友回復:
正如您對我對該問題的評論的回復所示,以下示例字串將按指示進行轉換:
'(aaa) (bbb (ccc)) ddd' => '(aaa) (bbb {ccc}) ddd'
'(aaa (eee)) (bbb ccc) ddd' => '(aaa {eee}) (bbb ccc) ddd'
'(aaa) (ee (ff (gg))) (bbb (ccc)) ddd' => '(aaa) (ee (ff {gg})) (bbb {ccc}) ddd'
我們無法使用單個正則運算式獲得這些結果,但我們可以通過執行一系列正則運算式來實作
r'\(([^()]*)\)(?=(?:[^()]*\)){n})'
n = 0, 1, ....替換為匹配項
r'{\1}'
如果n = N是不匹配的最小值n,則所需的替換由 生成的字串給出n = N-1。
我假設字串有平衡括號。
字串'a(b X c)'和'a(b(c(d X e)f)g)'有平衡括號;'a(b(c(d X e)fg)'并且'a(b))cd X ((efg)'不要。
字串中任何字符的嵌套級別等于遇到左括號之前的右括號數(等效地,遇到右括號之前的左括號數)。以下字串中的嵌套層級'X'如圖所示:
String Nesting level
_____________________________
a X b 0
a(b X c) 1
a(b(c X d)e)f 2
a(b(c(d X e)f)(g)) 3
考慮字串
'(aaa) (ee (ff (gg))) (bbb (ccc)) ddd'
我們首先設定n = 0獲取
r'\(([^()]*)\)(?=(?:[^()]*\)){0})'
Demo 0顯示匹配的替換產生字串
{aaa} (ee (ff {gg})) (bbb {ccc}) ddd
現在設定n = 1生成正則運算式
\(([^()]*)\)(?=(?:[^()]*\)){1})
演示 1顯示匹配的替換產生字串
(aaa) (ee (ff {gg})) (bbb {ccc}) ddd
接下來設定n = 2生成正則運算式
\(([^()]*)\)(?=(?:[^()]*\)){2})
Demo 2和Python demo顯示匹配的替換產生字串
(aaa) (ee (ff {gg})) (bbb (ccc)) ddd
接下來設定n = 3生成正則運算式
\(([^()]*)\)(?=(?:[^()]*\)){3})
演示 3顯示沒有匹配項。因此,我們得出結論n = 2是嵌套括號的最高級別,因此所需的替換字串必須是在 時產生的n = 2:
(aaa) (ee (ff {gg})) (bbb (ccc)) ddd
演示 4說明可能存在聯系。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/479786.html
