我想在Python中预处理器定义之间匹配文本文本。
在这个例子中,我想匹配删除文本,以便删除第2..4行,例如:
#if 1
# if 0
Remove me
# endif
Keep me
#endif
使用此正则表达式,它会删除文字,但.*
不会在第一个#endif
停止:
def remove_if0(string):
pattern = r"(^\s*#\s*if\s+0\b.*^\s*#\s*endif\b)"
regex = re.compile(pattern, re.MULTILINE | re.DOTALL)
return regex.sub("", string)
有没有办法在没有DOTALL阅读过期的情况下匹配对?例如^\s*#\s*endif\b
。
我尝试了(?!word)
,例如:(?!^\s*#\s*endif\b)*
- 但它没有用。
答案 0 :(得分:2)
解决方案是使用ungreedy .*?
(感谢@ bobble-bubble)
这是一个有效的Python函数:
def remove_if0(string):
pattern = r"(^\s*#\s*if\s+0\b.*?^\s*#\s*endif)"
regex = re.compile(pattern, re.MULTILINE | re.DOTALL)
return regex.sub("", string)