正则表达式和unicode

时间:2020-03-05 18:40:19  来源:igfitidea点击:

我有一个脚本,可以分析电视剧集的文件名(例如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'])),
]

解决方案

回答

根据需要使用[\ u0000- \ uFFFF]的子范围。

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

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

回答

\ X在某些语言中似乎可以用作通用字字符,它使我们可以匹配单个字符,而无需考虑占用了多少字节。可能有用。

回答

在Jeffrey Friedl的精通正则表达式(精湛的书)中,提到可以使用\ p {Letter}来匹配被认为是字母的unicode内容。