如何使用Python正则re.findall提取JSON中指定字段值存入列表
优先选择JSON解析方案(更稳定)
你提供的原始字符串是标准JSON结构,直接用Python内置的json模块解析取值远比重写正则靠谱,不会因为格式缩进、换行变化导致匹配失败,代码示例如下:
import json # 你的原始JSON字符串 original_str = ''' { "getYearsListOverview": { "sp_name": "analytics.year_overview_drop_down", "sp_input_params": { "req_url_query_params": [], "req_body_params": [] }, "sp_output_datasets": [], "page_name": "home" }, "getRankingsDataPerformanceReport": { "sp_name": "analytics.get_performance_ranking_data", "sp_input_params": { "req_url_query_params": [ ["@scroll_index", "index"] ], "req_body_params": [ ["@event_type_id", "event_type_id"], ["@season", "season"], ["@athlete_guid", "athlete_guid"] ] }, "sp_output_datasets": [], "number_of_output_datasets_for_customized_template": 4, "customised_response_template": { "performance_value_list": [], "rankings_table": [], "level_values": [] }, "page_name": "performancereport" } } ''' data = json.loads(original_str) # 初始化结果列表 sp_name = [] req_url_query_params = [] req_body_params = [] page_name = [] for item in data.values(): sp_name.append(item['sp_name']) page_name.append(item['page_name']) # 处理url参数 url_params = item['sp_input_params']['req_url_query_params'] if url_params: req_url_query_params.append(', '.join([f'{i[0]}, {i[1]}' for i in url_params])) else: req_url_query_params.append('') # 处理body参数 body_params = item['sp_input_params']['req_body_params'] if body_params: req_body_params.append(', '.join([f'{i[0]}, {i[1]}' for i in body_params])) else: req_body_params.append('') # 输出和示例一致的结果 print(f"{sp_name = }") print(f"{req_url_query_params = }") print(f"{req_body_params = }") print(f"{page_name = }")
正则实现方案(仅作为参考)
你的伪代码问题说明
你写的re.findall(r'sp_name(\w+)*',original_string)无法正确匹配,原因有二:
- 没有匹配
sp_name后面的冒号、双引号、空格这些固定字符 \w仅支持匹配字母、数字、下划线,无法匹配sp_name值里的.符号,也不能匹配参数里的引号、逗号等特殊字符
正确正则及代码示例
import re # 匹配规则,开启re.DOTALL让.可以匹配换行符 sp_name_list = re.findall(r'"sp_name"\s*:\s*"([^"]+)"', original_str) page_name_list = re.findall(r'"page_name"\s*:\s*"([^"]+)"', original_str) url_params_list = re.findall(r'"req_url_query_params"\s*:\s*\[(.*?)\]', original_str, flags=re.DOTALL) body_params_list = re.findall(r'"req_body_params"\s*:\s*\[(.*?)\]', original_str, flags=re.DOTALL) # 对参数做格式化处理,去掉多余的引号、空格、换行 def format_params(param_str): if not param_str.strip(): return '' # 提取所有双引号里的内容,再用逗号拼接 items = re.findall(r'"([^"]+)"', param_str) return ', '.join(items) req_url_query_params = [format_params(s) for s in url_params_list] req_body_params = [format_params(s) for s in body_params_list] # 输出结果 print(f"{sp_name = sp_name_list}") print(f"{req_url_query_params = }") print(f"{req_body_params = }") print(f"{page_name = page_name_list}")
内容的提问来源于stack exchange,提问作者pythondumb
相关产品推荐
相关产品推荐

