我目前正在编写一个文本处理脚本,其中包含静态文本和变量值(用大括号括起来)。我需要能够删除换行符,但前提是它们出现在大括号中:
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
答案 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))
请注意,此正则表达式不需要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
(?=[^{}]*})
预示断言我们在换行符之前有一个结束}
而没有在关闭{
之前匹配}
或}
。