30

TV エピソードのファイル名 (たとえば、show.name.s01e02.avi) を解析し、(www.thetvdb.com API から) エピソード名を取得し、自動的に適切な名前に変更するスクリプトがあります (番組名 - [01x02 ].avi)

[a-zA-Z0-9'\-]スクリプトは正常に動作しますが、それは、Unicode の表示名を持つファイルで試して使用するまでです(私が持っているすべてのファイルは英語であるため、ほとんどすべてが .

正規表現がアクセント付きの文字などと一致するようにするにはどうすればよいですか? 現在、正規表現の設定セクションは次のようになっています..

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が設定されている場合、文字に加えて、Unicode 文字プロパティ データベースで英数字として分類されているもの\wと一致します。[0-9_]

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(すばらしい本)のRegular Expressionsをマスターする際に、文字と見なされるUnicodeのものと一致する\p{Letter}を使用できると述べられています。

于 2008-08-18T10:17:35.340 に答える
0

\ Xは、一部の言語では一般的な単語文字として使用できるようです。これにより、使用するバイト数に関係なく、1文字を一致させることができます。役に立つかもしれません。

于 2008-08-18T09:53:13.860 に答える