为了账号安全,请及时绑定邮箱和手机立即绑定

用正则表达式删除最外面的花括号

用正则表达式删除最外面的花括号

幕布斯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 关注
  • 482 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信