我正在编写正则表达式,用于删除每个标记结束后的换行符,如模板字符串的“%}\n”但当内容位于{%verbatim%}内容{%endverbatim%}标记之间时,它不应该删除;如果存在{%endverbatim%}之后的换行符,也不应该删除。
我试过这个:
import re
def my_function(template_string):
replacement_string = template_string
found = re.search("{%\s*verbatim\s*%}(\s*.*\s*){%\s*endverbatim\s*%}", template_string, re.DOTALL)
replacement_string = re.sub("%}\n","%}", replacement_string, re.DOTALL)
replacement = "{%% verbatim %%}%s{%% endverbatim %%}" % found.group(1)
pattern = re.compile("{%\s*verbatim\s*%}(\s*.*\s*){%\s*endverbatim\s*%}", re.DOTALL)
result_string = pattern.sub(replacement, replacement_string)
return result_string
我用这个字符串测试这个正则表达式:
“这是测试字符串\n{%set var=2%}\n{%verbatim%}\n
逐字记录1{%set var2=4%}\n{%endverbatim%}{%set value=10%}\n{%
Verbatim%}在Verbatim 2{%set new_val=13%}中\n{%endVerbatim%}\n
..."
template_string = "This is test string\n {% set var=2 %}\n {% verbatim %}\n Inside verbatim 1 {% set var2=4%}\n {% endverbatim %} {% set value=10%}\n {% verbatim%} Inside verbatim 2 {% set new_val=13%}\n {% endverbatim %}\n ..."
my_function(template_string)
以上功能输出:
'这是测试字符串\n{%set var=2%}{%verbatim%}\n
逐字记录1{%set var2=4%}\n{%endverbatim%}{%set value=10%}\n{%
Verbatim%}在Verbatim 2{%set new_val=13%}中\n{%endVerbatim%}
“…”
我想要的结果:
'这是测试字符串\n{%set var=2%}{%verbatim%}\n
逐字记录1{%set var2=4%}\n{%endverbatim%}{%set value=10%}{%
Verbatim%}在Verbatim 2{%set new_val=13%}中\n{%endVerbatim%}\n
...'
最佳答案
你可以用
import re
template_string = "This is test string\n {% set var=2 %}\n {% verbatim %}\n Inside verbatim 1 {% set var2=4%}\n {% endverbatim %} {% set value=10%}\n {% verbatim%} Inside verbatim 2 {% set new_val=13%}\n {% endverbatim %}\n ..."
x = re.sub(r"(?s)((?:{%\s*verbatim\s*%}.*?)?{%\s*endverbatim\s*%})|%}\n", lambda m: (m.group(1) if m.group(1) else "%}"), template_string)
print(x)
见IDEONE demo
(?s)((?:{%\s*verbatim\s*%}.*?)?{%\s*endverbatim\s*%})|%}\n
正则表达式匹配:(?s)
-启用dotall模式(.
也与换行符匹配)((?:{%\s*verbatim\s*%}.*?)?{%\s*endverbatim\s*%})
-组1匹配(?:{%\s*verbatim\s*%}.*?)?
-一个或零个出现(=可选匹配){%
后跟零个或多个空白,然后verbatim
,然后再是零个或多个空白,然后是%}
,然后是零个或多个字符,但尽可能少到{%\s*endverbatim\s*%}
-{% endverbatim %}
其中,内部空间的数量可以是任意|
-或…%}\n
-a%}
+换行在替换部件中,lamda用于检查组1是否初始化(不是无),因为如果没有初始化,则带有
\1
的替换模式将失败。阅读关于这个问题的Empty string instead of unmatched group error。关于python - Python Regex:我想在每个'%}'标记关闭后删除换行符,但{%verbatim%}…{%endverbatim%}标记之间的内容除外,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35596628/