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