You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 14:15:35