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

如何编写正则表达式从提取的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规范(键名无引号、使用单引号),需要两步处理:

  1. 给无引号的键名添加双引号
  2. 将所有单引号替换为双引号

完整代码示例:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 00:10:57