我试图删除最外面的花括号,而只保留内部字符串。我的代码几乎可以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
提交
取消