如何编写正则表达式从提取的script文本中提取JSON数据?
解决方法
1. 正确的正则表达式编写
你之前的正则失败是因为非贪婪匹配.*?会在遇到第一个分号或闭合括号时提前终止,无法处理嵌套的大括号结构。需要用平衡括号正则来匹配完整的JSON结构:
import re import json # 原始提取的脚本文本 script_content = """function fbq_w123456as() { fbq('track', 'AddToCart', { contents: [ { 'id': '123456', 'quantity': '', 'item_price':69.99 } ], content_name: 'Stackoverflow', content_category: '', content_ids: ['w123456as'], content_type: 'product', value: 420.69, currency: 'USD' }); }""" # 匹配'AddToCart'后的完整JSON结构 pattern = r"fbq\('track', 'AddToCart', (\{(?:[^{}]|(?R))*\})\);" match = re.search(pattern, script_content, re.DOTALL)
这个正则的核心逻辑:
\{匹配JSON的起始大括号(?:[^{}]|(?R))*匹配任意非大括号字符,或递归匹配整个大括号结构(处理嵌套)\}匹配JSON的闭合大括号
2. 转换为标准JSON格式
提取到的原始字符串不符合标准JSON规范(键名无引号、使用单引号),需要两步处理:
- 给无引号的键名添加双引号
- 将所有单引号替换为双引号
完整代码示例:
if match: # 提取原始JSON字符串 raw_json = match.group(1) # 给键名添加双引号(匹配字母/数字/下划线组成的键名) formatted_json = re.sub(r"(\w+):", r'"\1":', raw_json) # 替换单引号为双引号 formatted_json = formatted_json.replace("'", '"') # 解析并输出标准JSON json_data = json.loads(formatted_json) print(json.dumps(json_data, indent=2))
运行后就能得到你需要的标准JSON格式。
内容的提问来源于stack exchange,提问作者Charlie
相关产品推荐
相关产品推荐

