99 lines
6.9 KiB
Python
99 lines
6.9 KiB
Python
# -*- encoding:utf-8 -*-
|
||
import json
|
||
import re
|
||
|
||
def post_process(value):
|
||
# 如果传入的是非字符串值,直接返回原值
|
||
if not isinstance(value, str):
|
||
return value
|
||
|
||
# 定义可能的分割模式及其正则表达式
|
||
patterns = [
|
||
(r'\d+、', r'(?=\d+、)'), # 匹配 '1、'
|
||
(r'[((]\d+[))]', r'(?=[((]\d+[))])'), # 匹配 '(1)' 或 '(1)'
|
||
(r'\d+\.', r'(?=\d+\.)'), # 匹配 '1.'
|
||
(r'[一二三四五六七八九十]、', r'(?=[一二三四五六七八九十]、)'), # 匹配 '一、'、'二、' 等
|
||
(r'[一二三四五六七八九十]\.', r'(?=[一二三四五六七八九十]\.)') # 匹配 '一.'、'二.' 等
|
||
]
|
||
|
||
# 初始化用于保存最早匹配到的模式及其位置
|
||
first_match = None
|
||
first_match_position = len(value) # 初始值设为文本长度,确保任何匹配都会更新它
|
||
|
||
# 遍历所有模式,找到第一个出现的位置
|
||
for search_pattern, split_pattern_candidate in patterns:
|
||
match = re.search(search_pattern, value)
|
||
if match:
|
||
# 如果这个匹配的位置比当前记录的更靠前,更新匹配信息
|
||
if match.start() < first_match_position:
|
||
first_match = split_pattern_candidate
|
||
first_match_position = match.start()
|
||
|
||
# 如果找到了最早出现的匹配模式,使用它来分割文本
|
||
if first_match:
|
||
blocks = re.split(first_match, value)
|
||
else:
|
||
# 如果没有匹配的模式,保留原文本
|
||
blocks = [value]
|
||
|
||
processed_blocks = []
|
||
for block in blocks:
|
||
if not block:
|
||
continue
|
||
# 计算中英文字符总数,如果大于50,则加入列表
|
||
if block and len(re.findall(r'[\u4e00-\u9fff\w]', block)) >= 50:
|
||
processed_blocks.append(block.strip())
|
||
else:
|
||
# 如果发现有块长度小于50,返回原数据
|
||
print(block)
|
||
return value
|
||
|
||
# 如果所有的块都符合条件,返回分割后的列表
|
||
return processed_blocks
|
||
|
||
# 递归地处理嵌套结构
|
||
def process_nested_data(data):
|
||
# 递归遍历字典,处理最内层的字符串
|
||
if isinstance(data, dict):
|
||
# 如果当前项是字典,继续递归遍历其键值对
|
||
result = {}
|
||
for key, value in data.items():
|
||
result[key] = process_nested_data(value) # 递归处理子项
|
||
return result
|
||
elif isinstance(data, list):
|
||
# 如果是列表,直接返回列表,保持原样
|
||
return data
|
||
else:
|
||
# 到达最内层,处理非字典和非列表的元素(字符串)
|
||
return post_process(data)
|
||
|
||
# 测试数据
|
||
# data = {
|
||
# '开标': {
|
||
# '开标': '1、黄石市公共资源电子交易平台远程不见面开标系统(以下简称:不见面开标系统)可以通过黄石市公共资源交易中心网站,黄石市工程建设电子交易系统(网址(https://gcjs.hsztbzx.com/login)进入不见面开投标人测试见面开标系统对投标人投标人测试见面开标系统对投标人标大厅,2、不见面开标系统对投标人测试测试见面开标系统对投标人测试见面开标系统对投标人测试见面开标系统对投标人测试见面开标系统对投标人测试见面投标人测试见面开标系统对投标人开标系统对投标人测试',
|
||
# '开标程序': [
|
||
# '主持人按下列程序在“电子交易平台”的“开标大厅”进行在线开标:(1)宣布开标纪律;(2)公布主持人、招标人代表、监标人等有关人员姓名;(3)公布在投标截止时间前投标文件的递交情况;(4)公布投标保证金递交情况;(5)投标人根据提示在投标人须知前附表规定的时间内解密投标文件;(6)读取已解密的投标文件的内容;(7)公布投标人名称、标段名称、投标保证金的递交情况、投标报价、质量目标、工期及其他内容,并生成开标记录;(8)开标结束。',
|
||
# '在本章第5.2.1(5)目规定的时间内,非因“电子交易平台”原因造成投标文件未解密的,视为投标人撤回投标文件。已解密的投标文件少于三个的,招标失败;已解密的投标文件不少于三个,开标继续进行。'
|
||
# ],
|
||
# '开标异议': [
|
||
# '投标人对开标有异议的,应当在开标过程中提出;招标人当场对异议作出答复,并记入开标记录。异议与答复应通过“开标大厅”在“异议与答复”菜单以书面形式进行。',
|
||
# '投标人异议成立的,招标人将及时采取纠正措施,或者提交评标委员会评审确认;投标人异议不成立的,招标人将当场给予解释说明。'
|
||
# ],
|
||
# '特殊情况的处置': [
|
||
# '1、黄石市公共资源电子交易平台远程不见面开标系统(以下简称:不见面开标系统)可以通过黄石市公共资源交易中心网站,黄石市工程建设电子交易系统(网址(https://gcjs.hsztbzx.com/login)进入不见面开标大厅,2、不见面开标系统对投标人测试测试见面开标系统对投标人测试见面开标系统对投标人测试见见面开标系统对投标人测试见面开标系面开标系统对投',
|
||
# '因“电子交易平台”系统故障导致无法正常开标的,招标人将暂停开标,待系统恢复正常后继续开标。',
|
||
# '“电子交易平台”系统故障是指下列情形:(1)系统服务器发生故障,无法访问或无法使用系统;(2)系统的软件或数据库出现错误,不能进行正常操作;(3)系统发现有安全漏洞,有潜在的泄密危险;(4)出现断电、断网事故;(5)其他无法保证招投标过程正常进行的情形。'
|
||
# ],
|
||
# '投标报价不参加评标基准价计算的情况': '若招标人发现投标文件出现投标人须知前附表中规定的投标报价不参加评标基准价计算的情况,经监标人确认后招标人将如实记录,其投标报价不参与评标基准价的计算,并提交评标委员会评审。'
|
||
# }
|
||
# }
|
||
data={
|
||
'开标': '1、黄石市公共资源电子交易平台远程不见面开标系统(以下简称:不见面开标系统)可以通过黄石市公共资源交易中心网站,黄石市工程建设电子交易系统(网址(https://gcjs.hsztbzx.com/login)进入不见面开投标人测试见面开标系统对投标人投标人测试见面开标系统对投标人标大厅,2、不见面开标系统对投标人测试测试见面开标系统对投标人测试见面开标系统对投标人测试见面开标系统对投标人测试见面开标系统对投标人测试见面投标人测试见面开标系统对投标人开标系统对投标人测试'
|
||
}
|
||
|
||
|
||
# 调用函数处理嵌套数据结构
|
||
result = process_nested_data(data)
|
||
print(json.dumps(result,ensure_ascii=False,indent=4))
|
||
|