gpt4 book ai didi

Python 正则表达式 : I want to remove newlines after every '%}' tag close except for content in between {% verbatim%} . .. {% endverbatim %} 标签

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:41:50 25 4
gpt4 key购买 nike

我正在编写正则表达式以在每个标记结束后删除换行符,例如模板字符串的“%}\n”。但当内容位于 {% verbatim %}content{% 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

我用这个字符串来测试这个正则表达式:

"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 ..."

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)

上面函数的输出:

'This is test string\n {% set var=2 %} {% verbatim %}\n Inside verbatim 1 {% set var2=4%}\n {% endverbatim %} {% set value=10%}\n {% verbatim%} Inside verbatim 2 {% set new_val=13%}\n {% endverbatim %}
...'

我想要的结果:

'This is test string\n {% set var=2 %} {% verbatim %}\n Inside verbatim 1 {% set var2=4%}\n {% endverbatim %} {% set value=10%} {% verbatim%} Inside 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 - %}+换行符

在替换部分,lamda 用于检查组 1 是否已初始化(不是 None),因为如果未初始化,则使用 \1 的替换模式将失败。阅读Empty string instead of unmatched group error关于这个问题。

关于Python 正则表达式 : I want to remove newlines after every '%}' tag close except for content in between {% verbatim%} . .. {% endverbatim %} 标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35596628/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com