功能特點(diǎn)
-
智能分組規(guī)則:
- 有"[]"且不為空:使用"[]"中的內(nèi)容分組
- 有"[]"但為空:使用"#"后面的內(nèi)容分組
- 沒(méi)有"[]":使用"#"前面的內(nèi)容分組
- 其他情況:使用原始name分組
完整name顯示:輸出所有分組的完整原始name
動(dòng)態(tài)格式對(duì)齊:自動(dòng)調(diào)整輸出寬度,確保長(zhǎng)name也能整齊顯示
交互式輸入:從標(biāo)準(zhǔn)輸入讀取內(nèi)容,支持多行粘貼
用戶(hù)友好:結(jié)果輸出后等待用戶(hù)確認(rèn)才關(guān)閉窗口
使用方法
- 運(yùn)行腳本
- 粘貼需要分析的文本內(nèi)容
- 輸入空行結(jié)束輸入
- 查看分析結(jié)果
- 按回車(chē)鍵退出
import re
from collections import defaultdict
import sys
def extract_name_key(name):
"""
根據(jù)規(guī)則提取name的關(guān)鍵字用于分組
"""
# 查找[]中的內(nèi)容
bracket_match = re.search(r'\[([^\]]*)\]', name)
if bracket_match:
bracket_content = bracket_match.group(1)
# 規(guī)則2: 如果[]中的內(nèi)容不為空,則使用[]中的內(nèi)容作為key
if bracket_content:
return bracket_content
else:
# 規(guī)則3: 如果[]中的內(nèi)容為空,則使用#號(hào)后面的內(nèi)容
hash_match = re.search(r'#([^(]*)', name)
if hash_match:
return hash_match.group(1).strip()
else:
# 如果沒(méi)有[],則使用#號(hào)前面的內(nèi)容作為key
hash_match = re.search(r'([^#]*)#', name)
if hash_match:
return hash_match.group(1).strip()
# 如果以上規(guī)則都不適用,則返回原始name
return name
def parse_input():
"""
從標(biāo)準(zhǔn)輸入解析內(nèi)容并統(tǒng)計(jì)相同name的size總和
"""
# 使用字典來(lái)存儲(chǔ)每個(gè)key的size總和和原始name列表
size_sum = defaultdict(lambda: [0.0, []])
print("請(qǐng)輸入要解析的內(nèi)容(輸入空行結(jié)束):")
# 從標(biāo)準(zhǔn)輸入讀取多行內(nèi)容
lines = []
while True:
try:
line = input()
if line.strip() == "": # 空行表示輸入結(jié)束
break
lines.append(line)
except EOFError:
break
# 如果沒(méi)有輸入內(nèi)容,則退出
if not lines:
print("沒(méi)有輸入任何內(nèi)容")
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():
# 解析輸入內(nèi)容并獲取統(tǒng)計(jì)結(jié)果
size_stats = parse_input()
if not size_stats:
print("沒(méi)有找到有效數(shù)據(jù)")
input("按回車(chē)鍵退出...")
return
# 準(zhǔn)備輸出數(shù)據(jù)
output_data = []
max_name_length = 0
for key, (total_size, original_names) in size_stats.items():
# 使用第一個(gè)原始name作為顯示名稱(chēng)
display_name = original_names[0]
# 更新最大name長(zhǎng)度
if len(display_name) > max_name_length:
max_name_length = len(display_name)
output_data.append((display_name, total_size))
# 設(shè)置name字段的寬度,確保對(duì)齊
# 最小寬度為40,但如果name更長(zhǎng)則使用實(shí)際長(zhǎng)度
name_width = max(max_name_length + 2, 40)
# 按size總和從大到小排序
sorted_stats = sorted(output_data, key=lambda x: x[1], reverse=True)
# 輸出結(jié)果
print("\n相同name的size總和統(tǒng)計(jì)(按從大到小排序):")
separator = "-" * (name_width + 20) # 動(dòng)態(tài)調(diào)整分隔線長(zhǎng)度
print(separator)
for i, (display_name, total_size) in enumerate(sorted_stats, 1):
# 使用動(dòng)態(tài)寬度確保對(duì)齊
print(f"{i:2d}. {display_name:<{name_width}} {total_size:>10.2f} KiB")
# 輸出總計(jì)信息
total_all = sum(size for _, size in sorted_stats)
print(separator)
print(f"總計(jì): {len(sorted_stats)} 個(gè)分組, 總大小: {total_all:.2f} KiB")
# 等待用戶(hù)輸入后才關(guān)閉窗口
input("\n按回車(chē)鍵退出...")
if __name__ == "__main__":
main()