删除大括号之间出现的换行符

时间:2016-10-12 15:45:41

标签: python regex python-3.x

我目前正在编写一个文本处理脚本,其中包含静态文本和变量值(用大括号括起来)。我需要能够删除换行符,但前提是它们出现在大括号中:

Some text\nwith a {variable\n} value"

为:

Some text\nwith a {variable} value"

在处理过程中,我已经这样做了:

re.sub(r'\{.*?\}', '(.*)', text, flags=re.MULTILINE|re.DOTALL)

但是我不确定如何只针对换行符,而不是整个花括号对。还有可能有多个换行符:

Some text\nwith a {variable\n\n\n} value"

使用Python 3.x

2 个答案:

答案 0 :(得分:2)

您可以将匹配对象传递给re.sub中的lambda并替换{...}中的所有换行符:

import re
text = 'Some text\nwith a {variable\n} value"'
print(re.sub(r'{.*?}', lambda m: m.group().replace("\n", ""), text, flags=re.DOTALL))

请参阅online Python 3 demo

请注意,此正则表达式不需要re.MULTILINE标记,因为它没有^ / $锚点来重新定义行为,并且您不需要转义{{1当前表达式中的{}和{(没有过多的反斜杠,正则表达式看起来更干净)。

答案 1 :(得分:2)

假设您有非嵌套的平衡括号,您可以使用此前瞻性正则表达式替换{...}之间的换行符:

>>> s = "Some text\nwith a {variable\n} value"
>>> print re.sub(r'\n(?=[^{}]*})', '', s)
Some text
with a {variable} value

(?=[^{}]*})预示断言我们在换行符之前有一个结束}而没有在关闭{之前匹配}}