如何用正则匹配并替换YAML中“IP Address”键下的IP地址
仅替换YAML中“IP Address”键对应的IP地址(含多行缩进值)
需求说明
我有一份YAML文件,其中IP Address键的取值是IP地址,可能是单行形式,也可能是多行缩进的形式(每行一个IP)。文件里其他键的取值即便符合x.x.x.x的IP格式,也不能被正则匹配替换。需要实现:
- 仅匹配
IP Address键对应的所有IP(包括后续缩进行的IP) - 将这些IP替换为指定值
some-replaced-value - 保留每行开头的空格,保证YAML格式有效
示例输入
test-key-1: some_value test-key-2: 8.23.12.0 test-key-3: some_value IP Address: 127.0.0.1 127.0.0.1 127.0.0.1 127.0.0.1 test-key-4: test-value
期望输出
test-key-1: some_value test-key-2: 8.23.12.0 test-key-3: some_value IP Address: some-replaced-value some-replaced-value some-replaced-value some-replaced-value test-key-4: test-value
解决方案
使用正向环视+多行模式的正则表达式,精准定位IP Address关联的IP地址:
正则匹配规则
(?<=IP Address: |^ +)\b(?:\d{1,3}\.){3}\d{1,3}\b
(?<=IP Address: |^ +):正向断言,确保匹配的IP要么紧跟在IP Address:之后,要么位于一行开头的空格(缩进)之后\b(?:\d{1,3}\.){3}\d{1,3}\b:匹配标准的IP地址格式(若需严格校验IP段0-255的合法范围,可替换为\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b)
替换逻辑
将匹配到的IP地址直接替换为some-replaced-value即可,正则会自动保留每行开头的空格(断言仅匹配IP的前置条件,不会把空格纳入匹配内容)。
代码示例(Python)
import re # 模拟YAML内容(实际场景可从文件读取) yaml_content = """test-key-1: some_value test-key-2: 8.23.12.0 test-key-3: some_value IP Address: 127.0.0.1 127.0.0.1 127.0.0.1 127.0.0.1 test-key-4: test-value""" # 执行正则替换 pattern = r'(?<=IP Address: |^ +)\b(?:\d{1,3}\.){3}\d{1,3}\b' result = re.sub(pattern, 'some-replaced-value', yaml_content, flags=re.MULTILINE) # 输出处理后的内容 print(result)
编辑器快速替换(以VS Code为例)
- 打开目标YAML文件,按
Ctrl+H调出替换面板 - 勾选「正则表达式」和「多行」选项
- 查找框输入上述正则,替换框输入
some-replaced-value - 点击「全部替换」完成操作
内容的提问来源于stack exchange,提问作者Sachin Kadam
相关产品推荐
相关产品推荐

