功能特点
-
智能分组规则:
- 有"[]"且不为空:使用"[]"中的内容分组
- 有"[]"但为空:使用"#"后面的内容分组
- 没有"[]":使用"#"前面的内容分组
- 其他情况:使用原始name分组
完整name显示:输出所有分组的完整原始name
动态格式对齐:自动调整输出宽度,确保长name也能整齐显示
交互式输入:从标准输入读取内容,支持多行粘贴
用户友好:结果输出后等待用户确认才关闭窗口
使用方法
- 运行脚本
- 粘贴需要分析的文本内容
- 输入空行结束输入
- 查看分析结果
- 按回车键退出
import re
from collections import defaultdict
import sys
def extract_name_key(name):
"""
根据规则提取name的关键字用于分组
"""
# 查找[]中的内容
bracket_match = re.search(r'\[([^\]]*)\]', name)
if bracket_match:
bracket_content = bracket_match.group(1)
# 规则2: 如果[]中的内容不为空,则使用[]中的内容作为key
if bracket_content:
return bracket_content
else:
# 规则3: 如果[]中的内容为空,则使用#号后面的内容
hash_match = re.search(r'#([^(]*)', name)
if hash_match:
return hash_match.group(1).strip()
else:
# 如果没有[],则使用#号前面的内容作为key
hash_match = re.search(r'([^#]*)#', name)
if hash_match:
return hash_match.group(1).strip()
# 如果以上规则都不适用,则返回原始name
return name
def parse_input():
"""
从标准输入解析内容并统计相同name的size总和
"""
# 使用字典来存储每个key的size总和和原始name列表
size_sum = defaultdict(lambda: [0.0, []])
print("请输入要解析的内容(输入空行结束):")
# 从标准输入读取多行内容
lines = []
while True:
try:
line = input()
if line.strip() == "": # 空行表示输入结束
break
lines.append(line)
except EOFError:
break
# 如果没有输入内容,则退出
if not lines:
print("没有输入任何内容")
return {}
# 解析每一行
for line in lines:
line = line.strip()
if not line.startswith('+ name:'):
continue
# 提取name和size
name_match = re.search(r'name:([^,]+)', line)
size_match = re.search(r'size:([\d.]+)KiB', line)
if name_match and size_match:
original_name = name_match.group(1)
size = float(size_match.group(1))
# 提取用于分组的key
key = extract_name_key(original_name)
# 累加size并保存原始name
size_sum[key][0] += size
size_sum[key][1].append(original_name)
return size_sum
def main():
# 解析输入内容并获取统计结果
size_stats = parse_input()
if not size_stats:
print("没有找到有效数据")
input("按回车键退出...")
return
# 准备输出数据
output_data = []
max_name_length = 0
for key, (total_size, original_names) in size_stats.items():
# 使用第一个原始name作为显示名称
display_name = original_names[0]
# 更新最大name长度
if len(display_name) > max_name_length:
max_name_length = len(display_name)
output_data.append((display_name, total_size))
# 设置name字段的宽度,确保对齐
# 最小宽度为40,但如果name更长则使用实际长度
name_width = max(max_name_length + 2, 40)
# 按size总和从大到小排序
sorted_stats = sorted(output_data, key=lambda x: x[1], reverse=True)
# 输出结果
print("\n相同name的size总和统计(按从大到小排序):")
separator = "-" * (name_width + 20) # 动态调整分隔线长度
print(separator)
for i, (display_name, total_size) in enumerate(sorted_stats, 1):
# 使用动态宽度确保对齐
print(f"{i:2d}. {display_name:<{name_width}} {total_size:>10.2f} KiB")
# 输出总计信息
total_all = sum(size for _, size in sorted_stats)
print(separator)
print(f"总计: {len(sorted_stats)} 个分组, 总大小: {total_all:.2f} KiB")
# 等待用户输入后才关闭窗口
input("\n按回车键退出...")
if __name__ == "__main__":
main()