幕布斯6054654
2021-05-05 16:45:24
我試圖刪除最外面的花括號,而只保留內部字符串。我的代碼幾乎可以100%工作,除非expr = 'namespace P {\\na; b;}'# I expect '\\na; b;'# but I get 'namespace P {\na; b;}' instead任何想法如何解決我的正則表達式字符串?import doctestimport redef remove_outer_curly_bracket(expr): """ >>> remove_outer_curly_bracket('P {') 'P {' >>> remove_outer_curly_bracket('P') 'P' >>> remove_outer_curly_bracket('P { a; b(); { c1(d,e); } }') ' a; b(); { c1(d,e); } ' >>> remove_outer_curly_bracket('a { }') ' ' >>> remove_outer_curly_bracket('') '' >>> remove_outer_curly_bracket('namespace P {\\na; b;}') '\\na; b;' """ r = re.findall(r'[.]*\{(.*)\}', expr) return r[0] if r else exprdoctest.testmod()
1 回答

倚天杖
TA貢獻1828條經驗 獲得超3個贊
這足以:
def remove_outer_curly_bracket(expr):
r = re.search(r'{(.*)}', expr, re.DOTALL)
return r.group(1) if r else expr
比賽將盡快開始,因此第一個{比賽確實會與最左邊的左括號匹配。因為*貪婪,.*將要盡可能的大,這將確保}匹配最后一個括號。
這兩個花括號都不是特殊字符,不需要轉義。此外,[.]*它可以連續匹配任意多個句點,并且完全不會幫助您完成此任務。
如果支架不平衡,這將不起作用。例如,for"{ { x }"將返回" { x",但是幸運的是您的示例不包含此類。
編輯:也就是說,這只是美化了原著。功能不變。正如blhsing在評論中所說,似乎您的代碼正在執行應有的功能。它甚至可以通過您的測試。
EDIT2:中沒有什么特別的'namespace P {\\na; b;}'。我相信你是'namespace P {\na; b;}'什么意思?里面有換行符嗎?確實,那是行不通的。我更改了代碼,然后進行了更改。問題是通常.匹配除換行符以外的所有字符。我們可以通過提供標志來修改該行為re.DOTALL。
添加回答
舉報
0/150
提交
取消