gpt4 book ai didi

python - 使用正则表达式检测具有 if 语句的 jinja2 变量 - python

转载 作者:太空宇宙 更新时间:2023-11-03 20:18:28 24 4
gpt4 key购买 nike

从下面的文件中,我只想提取 if 语句 block 并迭代它们也想只提取那些在 block 内有 image: 作为键的内容

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 }}

期望的输出:

{{- 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 }}

我已经尝试过以下代码,但它无法正常工作

with open(args.dataFileName) as fd:
data = fd.read()

match = re.findall(r'{{-?\s?if .+ end\s?}}', data, re.DOTALL)

如您所见,所需的输出仅包含 if 语句 block ,其中包含图像作为键有任何提示如何使用正则表达式来实现这一点吗?

最佳答案

正则表达式的一个限制是,只有在 if block 未嵌套时才有效。

此外,我只熟悉 Jinja2 中用于 if block {% if %}{% endif %}。因此,我正在按照您的指导寻找 {{-?\s*if\s*}}{{-?\s*end\s*}}。如果不正确,很容易纠正。

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()

打印:

{{- 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 }}

See demo

关于python - 使用正则表达式检测具有 if 语句的 jinja2 变量 - python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58304469/

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