如何使用Ansible正则提取指定位置的File ID?
从Ansible输出中提取File ID的方法
问题背景
我需要从Ansible playbook的输出中提取File ID。已定位到字段result_task_id.dnac_response.response.progress,该字段返回内容为:
{"fileId":"1ce07c2a-c3f9-46f3-b216-713d043871d6"}
仅需提取其中的ID值1ce07c2a-c3f9-46f3-b216-713d043871d6,ID内容会变化但位置固定(需提取第14至49个字符)。请问能否使用select('match'...)过滤器实现?对应的正则表达式是什么?
解决方案
1. 基于固定位置提取(最简单)
既然ID位置固定,直接用Python字符串切片更高效,无需正则:
- debug: msg: "{{ result_task_id.dnac_response.response.progress[13:49] }}"
注:Python字符串索引从0开始,第14个字符对应索引13,第49个字符对应索引48,因此切片范围是
[13:49]
2. 正则提取(更鲁棒)
如果担心格式微调(比如字段顺序变化),用正则更可靠。推荐用regex_search过滤器(比select更适合单字符串提取):
- debug: msg: "{{ result_task_id.dnac_response.response.progress | regex_search('\"fileId\":\"([a-f0-9-]+)\"', '\\1') | first }}"
对应的正则表达式:"fileId":"([a-f0-9-]+)"
"fileId":"匹配固定的键名前缀([a-f0-9-]+)捕获UUID格式的ID(由小写字母、数字、连字符组成)"匹配结尾的引号
3. 使用match过滤器实现(按需求)
select过滤器主要用于列表过滤,单字符串场景下直接用match配合regex_replace更合适:
- debug: msg: "{{ result_task_id.dnac_response.response.progress | match('.*\"fileId\":\"([a-f0-9-]+)\".*') | regex_replace('.*\"fileId\":\"([a-f0-9-]+)\".*', '\\1') }}"
这里match验证整个字符串符合格式,再通过regex_replace提取捕获组中的ID值。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

