<p>即使您有嵌套的if语句,您仍然可以使用Regex执行此操作,并且解析文本文件的速度会很快:</p>
<pre class="lang-py prettyprint-override"><code>import re
code = """
some text ....some text ....some text ....
some text ....some text ....some text ....
{{- if .Values.pvc.enabled [don't extract this 0]}}
some text ....
{{- end }}
{{- if .Values.k8swait.enabled [extract this 1}}
some text ....
image:
{{- end }}
{{- if .Values.k8swait.enabled [extract this 2]}}
some text ....
image: 000
{{- if [extract this 3]}}
image: 000
{{- end }}
{{- end }}
{{- if .Values.k8swait.enabled [extract this 4}}
some text ....
image:
{{- end }}
{{- if .Values.k8swait.enabled [extract this 5]}}
some text ....
image: 000
{{- if [don't extract this sub if 6 ]}}
{{- end }}
{{- end }}
"""
def extract_image_if_statement(text):
# this to extract nested ifs or if preceded by if statements
sub_if = re.compile("((?:{{-\s*if.+?)+)({{-\s*if.+?end\s*}})", re.DOTALL)
# this to extract if statement that left by the first pattern
outer_if = re.compile("{{-\s*if.+?end\s*}}", re.DOTALL)
# used to get the if statement by index from expression list
get_if = re.compile("#(\d)#")
# used to build back full nested expression
expression = []
# to hold expression that contains image: word
result = []
index = 0
def extract_if(pattern, repl, index_group):
"""
extract the if statement to expression and replace it with special word in the text.
#index_in_expression_list#.
index_group is the position of the target if statement because we have two pattern.
repl contains {} to format the current index of extract if statement
"""
nonlocal text
nonlocal index
m = pattern.search(text)
while m:
expression.append(m.group(index_group))
text = pattern.sub(repl.format(index), text)
m = sub_if.search(text)
index += 1
return index
def build_if_statement(exp):
""" we have the index of exp in expression so keep building back the statement, this is only for nested statements"""
while get_if.search(exp):
exp = get_if.sub(lambda m: expression[int(m.group(1))], exp)
return exp
# extract all if statements
extract_if(sub_if, r'\1#{}#', 2)
extract_if(outer_if, r'#{}#', 0)
# for debugging
# print('\n\n\n'.join(expression))
result = [build_if_statement(exp) for exp in expression if 'image:' in exp]
# for debugging
# print('\n\n'.join(result))
# print(text) # if you need Order this will help with it just tell me so I can fix that.
return result
# Note this extract sub if and outer if if they both have image: word like [2,3]
print(('\n'+'-'*100+'\n').join(extract_image_if_statement(code)))
</code></pre>
<p>输出:</p>
<pre class="lang-none prettyprint-override"><code>{{- if .Values.k8swait.enabled [extract this 5]}}
some text ....
image: 000
{{- if [don't extract this sub if 6 ]}}
{{- end }}
{{- end }}
{{- if .Values.k8swait.enabled [extract this 4}}
some text ....
image:
{{- end }}
{{- if [extract this 3]}}
image: 000
{{- end }}
{{- if .Values.k8swait.enabled [extract this 2]}}
some text ....
image: 000
{{- if [extract this 3]}}
image: 000
{{- end }}
{{- end }}
{{- if .Values.k8swait.enabled [extract this 1}}
some text ....
image:
{{- end }}
</code></pre>
<p>如果<code>if statements</code>的顺序对您很重要,那么我们也可以解决这个问题,只需对如何提取嵌套语句进行注释。如果在嵌套<code>if statements</code>的情况下,如果外部表达式有<code>image:</code>单词,并且子表达式也有该单词to,那么在结果中,我提取了两个元素</strong>,如果你不想这样做的话,只需放一个注释,我也会修复它。你知道吗</p>
<p>我希望这能帮你好运。你知道吗</p>