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

我试图删除最外面的花括号,而只保留内部字符串。我的代码几乎可以100%工作,除非


expr = 'namespace P {\\na; b;}'


# I expect '\\na; b;'

# but I get 'namespace P {\na; b;}' instead

任何想法如何解决我的正则表达式字符串?


import doctest

import re


def 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 expr


doctest.testmod()


幕布斯6054654
浏览 483回答 1
1回答

倚天杖

这足以: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。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python