如何从逗号分隔的单个字段中动态提取多个IPv4地址?
提取JSON格式字段中多个IPv4地址的正则方案
问题场景
需要从类似如下的字符串中提取badips字段下的所有IPv4地址,最终以空格分隔输出:
"badips":["123.456.789.12","123.456.789.13","123.456.789.14"]
期望输出:123.456.789.12 123.456.789.13 123.456.789.14
此前尝试的正则要么只能提取第一个IP,要么会包含引号和逗号,需要能动态匹配至少1个IP的方案。
解决方案
方案一:精准匹配badips字段并提取
使用以下正则捕获badips数组内的内容,再替换掉分隔符:
"badips":\["(?P<badips>(?:\d+\.\d+\.\d+\.\d+)(?:","\d+\.\d+\.\d+\.\d+)*)"\]
- 正则解析:
"badips":\[:精准定位badips数组的起始前缀(?P<badips>...):命名捕获组,用于提取数组内的所有IP内容(?:\d+\.\d+\.\d+\.\d+):匹配单个IPv4地址(非捕获组,仅用于重复匹配逻辑)(?:","\d+\.\d+\.\d+\.\d+)*:匹配后续的","IP组合,*支持0次或多次重复,保证至少能匹配1个IP"\]:匹配数组的结束部分
捕获内容后,将其中的","替换为空格即可得到目标格式。
示例代码(Python):
import re target_str = '"badips":["123.456.789.12","123.456.789.13","123.456.789.14"]' pattern = r'"badips":\["(?P<badips>(?:\d+\.\d+\.\d+\.\d+)(?:","\d+\.\d+\.\d+\.\d+)*)"\]' match_result = re.search(pattern, target_str) if match_result: clean_ips = match_result.group('badips').replace('","', ' ') print(clean_ips) # 输出:123.456.789.12 123.456.789.13 123.456.789.14
方案二:全局匹配所有IPv4地址(更简单)
如果字符串中没有其他无关的IPv4地址,可以直接用全局匹配提取所有符合格式的IP,再用空格拼接:
\d+\.\d+\.\d+\.\d+
示例代码(Python):
import re target_str = '"badips":["123.456.789.12","123.456.789.13","123.456.789.14"]' ip_list = re.findall(r'\d+\.\d+\.\d+\.\d+', target_str) print(' '.join(ip_list)) # 输出:123.456.789.12 123.456.789.13 123.456.789.14
进阶补充
- 若需要严格符合IPv4规范(每个段取值0-255),可使用更严谨的IP匹配正则:
(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.(?:25[0-5]|2[0-4]\d|[01]?\d\d?) - 如果处理的是标准JSON数据,优先用JSON解析库(比如Python的
json模块),比正则更可靠:import json target_str = '{"badips":["123.456.789.12","123.456.789.13","123.456.789.14"]}' data = json.loads(target_str) print(' '.join(data['badips']))
内容的提问来源于stack exchange,提问作者jlit259
相关产品推荐
相关产品推荐

