从 Word 文档中提取所有的有效 JSON 对象(包含跨段落)

一、概述

从 word 中提取所有有效 json (包含跨段落的 json)。

二、代码

"""
从 Word 文档中提取所有的 JSON 对象
原理:
1.遇到"{",将"{"存入数组,并开始计数
2.遇到"}",则取出全部字符,如果没有剩余,则是一个完整的 {}
3.判断完整的{}是否是有效的 json
"""

from docx import Document
import json


def extract_json_from_docx(doc_path):
    """从 Word 文档中提取所有的 JSON 对象"""
    document = Document(doc_path)

    all_text = ""
    for para in document.paragraphs:
        all_text += para.text.strip()

    return extract_json_from_text(all_text)


def extract_json_from_text(all_text):
    json_objects = []
    stack = []
    start_index = 0
    for i in range(len(all_text)):
        if all_text[i] == "{":
            stack.append("{")
            if len(stack) == 1:  # 当栈中只有一个 "{" 时,记录开始索引
                start_index = i
        elif all_text[i] == "}":
            if stack:  # 如果栈不为空
                stack.pop()
                # print(stack)
                if not stack:  # 如果弹出后栈为空,表示找到一个完整的 JSON 对象
                    json_str = all_text[start_index: i + 1]
                    try:
                        json_obj = json.loads(json_str)
                        json_objects.append(json_obj)
                        print(f"有效 JSON: {json_obj}")
                    except json.JSONDecodeError:
                        print(f"无效 JSON: {json_str}")
    return json_objects


def remove_outer_braces(text):
    """
    单独处理{{}}这种情况
    :param text: 包含嵌套 JSON 的文本
    :return: 去除了最外层大括号的 JSON 字符串
    """
    start_index = text.find('{{')
    end_index = text.rfind('}}')

    if start_index != -1 and end_index != -1 and start_index < end_index:
        return text[start_index + 1:end_index + 1]
    else:
        return text


if __name__ == "__main__":
    # doc_path = "/Users/wangfugui/Downloads/test.docx"
    # extract_json_from_docx(doc_path)
    text = """aaa
    {{
        "name": "张三",
        "age": 30,
        "city": "上海"
    }}
    """
    print(remove_outer_braces(text))
    print('*'*10)
    print(extract_json_from_text(remove_outer_braces(text)))
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码上富贵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值