正则表达式与unicode

31 投票
4 回答
17881 浏览
提问于 2025-04-10 23:41

我有一个脚本,它可以解析电视节目的文件名(比如 show.name.s01e02.avi),然后从 www.thetvdb.com 的接口获取剧集名称,最后把文件名自动改成更好看的格式(比如 Show Name - [01x02].avi)。

这个脚本运行得很好,直到我尝试在一些包含Unicode剧名的文件上使用它(这点我之前没想到,因为我手上的文件都是英文的,所以大部分都在 [a-zA-Z0-9'\-] 这个范围内)。

我该如何让正则表达式也能匹配带重音符号的字符等呢?目前正则表达式的配置部分看起来是这样的……

config['valid_filename_chars'] = """0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@£$%^&*()_+=-[]{}"'.,<>`~? """
config['valid_filename_chars_regex'] = re.escape(config['valid_filename_chars'])

config['name_parse'] = [
    # foo_[s01]_[e01]
    re.compile('''^([%s]+?)[ \._\-]\[[Ss]([0-9]+?)\]_\[[Ee]([0-9]+?)\]?[^\\/]*$'''% (config['valid_filename_chars_regex'])),
    # foo.1x09*
    re.compile('''^([%s]+?)[ \._\-]\[?([0-9]+)x([0-9]+)[^\\/]*$''' % (config['valid_filename_chars_regex'])),
    # foo.s01.e01, foo.s01_e01
    re.compile('''^([%s]+?)[ \._\-][Ss]([0-9]+)[\.\- ]?[Ee]([0-9]+)[^\\/]*$''' % (config['valid_filename_chars_regex'])),
    # foo.103*
    re.compile('''^([%s]+)[ \._\-]([0-9]{1})([0-9]{2})[\._ -][^\\/]*$''' % (config['valid_filename_chars_regex'])),
    # foo.0103*
    re.compile('''^([%s]+)[ \._\-]([0-9]{2})([0-9]{2,3})[\._ -][^\\/]*$''' % (config['valid_filename_chars_regex'])),
]

4 个回答

4

在杰弗里·弗里德尔的《精通正则表达式》这本好书里提到,你可以使用 \p{Letter} 这个写法,它可以匹配被认为是字母的 Unicode 字符。

5

Python的re模块不支持\p{Letter}或\X这两个功能。不过,在PyPI上有一个新的regex实现是支持这些功能的。

21

你可以使用 [\u0000-\uFFFF] 这个范围来满足你的需求。

你还可以使用 re.UNICODE 这个编译标志。文档中提到,如果设置了 UNICODE,那么 \w 就会匹配 [0-9_] 这些字符,还有其他在 Unicode 字符属性数据库中被归类为字母数字的字符。

另外,你可以查看 这个链接

撰写回答