Unicode文本正则过滤生成合法文件名的Python方案优化问询
问题解答
现有方案是否符合需求?
现有用regex.sub(r'[^\w\s]', '', random_string)的方案,基本符合“保留基础可读性即可牺牲精确性”的需求,但存在明显局限性:
- 优点:快速过滤所有非单词、非空白字符,保留的内容足够让译者识别元数据对应的翻译片段,满足基础可读性要求。
- 缺点:
\w在regex库中虽匹配Unicode单词字符,但部分语言的特殊字符(如东南亚语言声调符号、阿拉伯语连写字符)可能被误过滤;同时保留过多空白字符会导致文件名冗余。
更稳健的替代实现
方案1:基于Unicode脚本的白名单过滤(支持本地化配置)
利用regex库的Unicode脚本属性(如\p{Cyrillic}、\p{Han}),结合项目本地化语言配置,只保留目标语言脚本字符、数字、空白和少量安全标点(连字符-、下划线_是多数文件系统允许的)。
示例代码:
import regex def clean_filename(text, allowed_scripts=['Cyrillic', 'Han', 'Latin'], allowed_punctuation=['-', '_']): # 构建正则模式:允许的脚本字符 + 数字 + 空白 + 允许的标点 script_pattern = '|'.join([f'\\p{{{script}}}' for script in allowed_scripts]) safe_chars = regex.escape(''.join(allowed_punctuation)) pattern = rf'[^{script_pattern}\d\s{safe_chars}]' # 替换非法字符为空白,压缩连续空白为单个空格后去除首尾空白 cleaned = regex.sub(pattern, '', text) cleaned = regex.sub(r'\s+', ' ', cleaned).strip() # 可选:将空格替换为下划线,避免文件名含空格的兼容性问题 return cleaned.replace(' ', '_')
方案2:基于文件系统通用黑名单的过滤
直接过滤所有文件系统通用禁止的字符(交集为\/:*?"<>|),保留所有Unicode可打印字符(含各语言脚本、变音符号),兼顾兼容性和可读性。
示例代码:
import regex def clean_filename_blacklist(text): # 文件系统通用非法字符黑名单 illegal_chars = r'[\\/:*?"<>|]' # 替换非法字符为下划线,压缩连续空白 cleaned = regex.sub(illegal_chars, '_', text) cleaned = regex.sub(r'\s+', ' ', cleaned).strip() return cleaned
各语言脚本真实测试用例
- 西里尔文:
~!ќ®†њѓѕў‘“ъйжюёф №%:,)( ЛПМКё…∆≤≥“™ƒђ≈≠»` - 中文:
《红楼梦》第3回 第12-15段 译者:张三 - 拉丁文(含变音符号):
Don Quixote, Chapter 5, Pages 23-25 (Translator: María García) - 阿拉伯文:
ألف ليلة وليلة، فصل 7، صفحات 45-48 (مترجم: علي محمد) - 日文:
夏目漱石『吾輩は猫である』第2章 ページ18-20 訳者:田中太郎 - 泰文:
นิทานสัตว์เลี้ยง ภาคที่4 หน้า30-32 ผู้แปล: สุนทร ภูมิ
关于Unicode脚本标识的覆盖性
Unicode脚本属性(如\p{Cyrillic}、\p{Han}、\p{Arabic}等)覆盖了几乎所有主流及小众语言的脚本,完全支持按项目本地化语言配置——只需在allowed_scripts参数中传入对应项目的语言脚本标识即可。
内容的提问来源于stack exchange,提问作者horace
相关产品推荐
相关产品推荐

