我正在编写正则表达式,用于删除每个标记结束后的换行符,如模板字符串的“%}\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/

10-09 13:38