<p><strong>正则表达式的一个限制是,只有当<code>if</code>块没有嵌套时,它才起作用。</strong></p>
<p>另外,我只熟悉Jinja2中用于<em>if块</em>的<code>{% if %}</code>和<code>{% endif %}</code>。所以,我跟随你寻找<code>{{-?\s*if\s*}}</code>和<code>{{-?\s*end\s*}}</code>。如果这是不正确的,它很容易补救。你知道吗</p>
<pre><code>import re
text = """apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: {{ template "fullname" . }}
labels:
app: {{ template "fullname" . }}
chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
release: "{{ .Release.Name }}"
heritage: "{{ .Release.Service }}"
spec:
replicas: {{ .Values.replicas }}
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
minReadySeconds: 5
template:
metadata:
labels:
name: {{ template "fullname" . }}
app: {{ template "fullname" . }}
spec:
{{- if .Values.pvc.enabled }}
volumes:
- name: {{ template "fullname" . }}
persistentVolumeClaim:
claimName: {{ template "claimname" . }}
{{- end }}
{{- if .Values.k8swait.enabled }}
serviceAccountName: {{ template "fullname" . }}-admin
initContainers:
- env:
- name: CLUSTER
value: "{{ .Values.k8swait.parameters.cluster}}"
- name: NAMESPACE
value: "{{ .Release.Namespace }}"
- name: RESOURCE
value: "{{ .Values.k8swait.parameters.resource}}"
- name: RNAME
value: "{{ .Values.k8swait.job.jobname }}"
- name: TIMEOUT
value: "{{ .Values.k8swait.parameters.timeout}}"
- name: FREQUENCE
value: "{{ .Values.k8swait.parameters.frequence}}"
name: {{ .Values.k8swait.parameters.name}}
image: "{{ .Values.global.registry1 }}/{{ .Values.k8swait.repo }}:{{ .Values.k8swait.tag }}"
resources:
limits:
cpu: "{{ .Values.resources.limits.cpu }}"
memory: "{{ .Values.resources.limits.memory }}"
requests:
cpu: "{{ .Values.resources.requests.cpu }}"
memory: "{{ .Values.resources.requests.memory }}"
{{- end }}
securityContext:
runAsUser: 1000
fsGroup: 1000
containers:
- name: {{ template "fullname" . }}
image: "{{ .Values.global.registry }}/{{ .Values.image.repository }}:{{ .Values.image.tag }}"
imagePullPolicy: {{ default "" .Values.imagePullPolicy | quote }}
ports:
- name: http
containerPort: 9000
{{- if .Values.pvc.enabled }}
image: "{{ .Values.global.registry1 }}/{{ .Values.k8swait.repo }}:{{ .Values.k8swait.tag }}"
volumeMounts:
- mountPath: /BACKUP
name: "{{ template "fullname" . }}"
{{- end }}"""
start_if = r'{{-?\s*if\s*[^}]+}}' # {{- if }}
end_if = r'{{-?\s*end\s*}}' # {{- end }}
regex = re.compile(f'{start_if}(.*?){end_if}', flags=re.DOTALL)
matches = [m.group(0) for m in regex.finditer(text) if 'image: ' in m.group(1)]
for match in matches:
print(match)
print()
</code></pre>
<p>印刷品:</p>
<pre><code>{{- if .Values.k8swait.enabled }}
serviceAccountName: {{ template "fullname" . }}-admin
initContainers:
- env:
- name: CLUSTER
value: "{{ .Values.k8swait.parameters.cluster}}"
- name: NAMESPACE
value: "{{ .Release.Namespace }}"
- name: RESOURCE
value: "{{ .Values.k8swait.parameters.resource}}"
- name: RNAME
value: "{{ .Values.k8swait.job.jobname }}"
- name: TIMEOUT
value: "{{ .Values.k8swait.parameters.timeout}}"
- name: FREQUENCE
value: "{{ .Values.k8swait.parameters.frequence}}"
name: {{ .Values.k8swait.parameters.name}}
image: "{{ .Values.global.registry1 }}/{{ .Values.k8swait.repo }}:{{ .Values.k8swait.tag }}"
resources:
limits:
cpu: "{{ .Values.resources.limits.cpu }}"
memory: "{{ .Values.resources.limits.memory }}"
requests:
cpu: "{{ .Values.resources.requests.cpu }}"
memory: "{{ .Values.resources.requests.memory }}"
{{- end }}
{{- if .Values.pvc.enabled }}
image: "{{ .Values.global.registry1 }}/{{ .Values.k8swait.repo }}:{{ .Values.k8swait.tag }}"
volumeMounts:
- mountPath: /BACKUP
name: "{{ template "fullname" . }}"
{{- end }}
</code></pre>
<p><a href="http://ideone.com/10NTcv" rel="nofollow noreferrer">See demo</a></p>