亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

用正則表達式刪除最外面的花括號

用正則表達式刪除最外面的花括號

幕布斯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。


查看完整回答
反對 回復 2021-05-18
  • 1 回答
  • 0 關注
  • 543 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號