正则表达式和Unicode

2024-05-31 23:52:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个脚本,可以解析电视节目的文件名(例如show.name.s01e02.avi),获取节目名(来自www.thetvdb.com API),并自动将它们重命名为更好的名称(show name-[01x02].avi)

这个脚本工作得很好,直到您尝试在具有Unicode显示名称的文件上使用它(我从未真正想过,因为我拥有的所有文件都是英文的,所以大部分都属于[a-zA-Z0-9'\-]

如何允许正则表达式匹配重音字符等?目前regex的config部分看起来像。。

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'])),
]

Tags: namere脚本名称configfooshowfilename
3条回答

在掌握Jeffrey Friedl(好书)中的正则表达式时,我们提到可以使用与unicode中的字母匹配的\p{Letter}。

使用子范围[\u0000-\uFFFF]来获得所需内容。

您还可以使用re.UNICODE编译标志。The docs假设设置了UNICODE,则\w将匹配字符[0-9_]以及Unicode字符属性数据库中分类为字母数字的字符。

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

Python的re模块不支持\p{Letter}或\X。

相关问题 更多 >