You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 19:07:36