正規表現とユニコード
-
08-06-2019 - |
質問
テレビ エピソードのファイル名 (show.name.s01e02.avi など) を解析し、エピソード名を (www.thetvdb.com API から) 取得して、より適切な名前 (番組名 - [01x02) に自動的に変更するスクリプトがあります。 ].avi)
このスクリプトは、Unicode の show-name を持つファイルで使用してみるまでは正常に動作します (私が持っているファイルはすべて英語なので、ほとんどすべてのファイルがこの範囲内に収まるので、まったく考えたこともありませんでした) [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.
他のヒント
Python の re モジュールは \p{Letter} または \X をサポートしていません。しかし PyPI での新しい正規表現の実装 そうです。
Jeffrey Friedl の Mastering Regular Expressions (素晴らしい本) には、文字とみなされる Unicode のものと一致する \p{Letter} を使用できることが記載されています。
\X は一部の言語で一般的な単語文字として利用できるようで、それを使用すると、占有バイト数に関係なく 1 つの文字と一致させることができます。役に立つかも知れません。