我有以下文本文件(文件最多可以包含几百行):
<% some important text %> something <% important stuff %>
not important stuff <not important stuff>
<% some
important text
%>
很容易地,我需要用空格替换不在“ <%%>”分隔符之间的任何内容。一行中可能会出现<%text%>的多次情况。同样,如上例所示,<%%>块可能会分布在多行上。 结果应如下所示:
<% some important text %> <% important stuff %>
<% some
important text
%>
任何建议如何处理?尝试过正则表达式,很容易获得<%text%>,但这还不够,我需要在模式不匹配的所有地方放置空格。 将不胜感激。
答案 0 :(得分:0)
尝试此正则表达式:
(?s)(?<=%>).*?(?=<%)
它具有正向后看(-ahead),(?s)
打开单行选项(在您的正则表达式引擎中可能有所不同)。
答案 1 :(得分:0)
使用“ <%”标记分隔整个文本。
在每个子字符串中搜索“%>”文字。
用空格替换该位置之后的所有内容。
重新加入所有子串。
答案 2 :(得分:0)
一种解决方案可以使用>>> lst = ['[175', '178', '182', '172', '167', '164]', "['b']"]
>>> ','.join(lst)
"[175,178,182,172,167,164],['b']"
>>> ast.literal_eval(','.join(lst))
([175, 178, 182, 172, 167, 164], ['b'])
>>> [x for sub in ast.literal_eval(','.join(lst)) for x in sub]
[175, 178, 182, 172, 167, 164, 'b']
元字符:
\G
并替换为(%>\R*|\G\R*(?!<%)).
(注意尾随空格)
请参见正则表达式live demo here
正则表达式细目:
$1
开始捕获#1组
(
匹配%>\R*
和任何可选的尾随换行符%>
或|
匹配主题字符串的开头,或者之前的匹配结束,然后是\G\R*(?!<%)
之后的任何可选的尾随换行符<%
捕获#1组结束)
匹配单个字符(换行符除外)Java代码:
.
免责声明
这是假定
您没有嵌套块
s = s.replaceAll("(%>\\R*|\\G\\R*(?!<%)).", "$1 ");
和<%
分隔符已正确配对
%>
和<%
永远不会在块外发生