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

时间:2018-08-03 01:45:16

标签: python regex

我正在尝试删除最外面的花括号,同时仅保留内部字符串。我的代码几乎可以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()

1 个答案:

答案 0 :(得分:1)

满足:

def remove_outer_curly_bracket(expr):
    r = re.search(r'{(.*)}', expr, re.DOTALL)
    return r.group(1) if r else expr

比赛将尽快开始,因此第一个{的确会匹配最左边的左括号。由于*贪婪,因此.*希望尽可能大,这样可以确保}与最后一个右括号匹配。

两个大括号都不是特殊字符,不需要转义;此外,[.]*连续匹配任意多个句点,将完全无法帮助您完成此任务。

如果括号不平衡,这将不起作用。例如,对于"{ { x }"将返回" { x",但是幸运的是您的示例中没有这样的内容。

编辑:也就是说,这只是美化了原著。功能不变。正如blhsing在评论中所说,似乎您的代码正在执行应有的功能。它甚至可以通过您的测试。

EDIT2:'namespace P {\\na; b;}'中没有什么特别的。我相信您是说'namespace P {\na; b;}'?里面有换行符吗?确实,那是行不通的。我更改了代码,然后进行了更改。问题是通常.与每个字符(换行符除外)匹配。我们可以通过提供标志re.DOTALL来修改该行为。