30

我有一个脚本可以解析电视剧集的文件名(例如 show.name.s01e02.avi),获取剧集名称(来自 www.thetvdb.com API)并自动将它们重命名为更好的名称(显示名称 - [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 回答 4

20

使用[\u0000-\uFFFF]您想要的子范围。

您也可以使用re.UNICODE编译标志。文档说如果UNICODE设置,\w将匹配字符[0-9_]加上在 Unicode 字符属性数据库中归类为字母数字的任何内容。

另见http://coding.derkeiler.com/Archive/Python/comp.lang.python/2004-05/2560.html

于 2008-08-18T09:43:10.493 回答
5

Python 的 re 模块不支持 \p{Letter} 或 \X。但是,PyPI 上的新正则表达式实现确实如此。

于 2011-04-01T23:19:55.527 回答
4

在 Jeffrey Friedl 的 Mastering Regular Expressions(好书)中提到,您可以使用 \p{Letter} 来匹配被视为字母的 unicode 内容。

于 2008-08-18T10:17:35.340 回答
0

\X 似乎在某些语言中可用作通用单词字符,它允许您匹配单个字符而不管它占用多少字节。可能有用。

于 2008-08-18T09:53:13.860 回答