正则表达式与unicode
我有一个脚本,它可以解析电视节目的文件名(比如 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实现是支持这些功能的。