したがって、正規表現を使用して一致させたい Unicode 文字の長いシーケンスがあります。
char_set = '\u0041-\u005A|\u00C0-\u00D6|\u00D8-\u00DE|\u0100|\u0102|\u0104|\u0106|\u0108|\u010A|\u010C|\u010E|\u0110|\u0112|\u0114|\u0116|\u0118|\u011A|\u011C|\u011E|\u0120|\u0122|\u0124|\u0126|\u0128|\u012A|\u012C|\u012E|\u0130|\u0132|\u0134|\u0136|\u0139|\u013B|\u013D|\u013F|\u0141|\u0143|\u0145|\u0147|\u014A|\u014C|\u014E|\u0150|\u0152|\u0154|\u0156|\u0158|\u015A|\u015C|\u015E|\u0160|\u0162|\u0164|\u0166|\u0168|\u016A|\u016C|\u016E|\u0170|\u0172|\u0174|\u0176|\u0178|\u0179|\u017B|\u017D'
(これらはすべて Unicode 範囲 0-382 で理解される大文字です。それらのほとんどはアクセント付きです。PEP8 は Python スクリプトでの非 ASCII 文字の使用を推奨しないため、文字列リテラルの代わりに Unicode コードを使用しています。)
その長い文字列を直接コンパイルするだけで機能します。たとえば、これは次の文字のいずれかで始まるすべての単語に一致します。
regex = re.compile(u'\A[\u0041-\u005A|\u00C0-\u00D6|\u00D8-\u00DE|\u0100|\u0102|\u0104|\u0106|\u0108|\u010A|\u010C|\u010E|\u0110|\u0112|\u0114|\u0116|\u0118|\u011A|\u011C|\u011E|\u0120|\u0122|\u0124|\u0126|\u0128|\u012A|\u012C|\u012E|\u0130|\u0132|\u0134|\u0136|\u0139|\u013B|\u013D|\u013F|\u0141|\u0143|\u0145|\u0147|\u014A|\u014C|\u014E|\u0150|\u0152|\u0154|\u0156|\u0158|\u015A|\u015C|\u015E|\u0160|\u0162|\u0164|\u0166|\u0168|\u016A|\u016C|\u016E|\u0170|\u0172|\u0174|\u0176|\u0178|\u0179|\u017B|\u017D]')
しかし、同じ文字列を他のいくつかの正規表現で再利用したいと考えています。毎回単純にコピーして貼り付けることができますが、それは醜いです。したがって、同様の質問に対する以前の回答に基づいて、これを試しました:
regex = re.compile(u'\A[%s]' % char_set)
ダメ。どういうわけか、上記の式は、変数「char_set」の下にハードコードされたものだけでなく、任意の文字に一致するようです。
私もこれを試しました:
regex = re.compile(u'\A[' + char_set + ']')
この:
regex = re.compile(u'\A[' + re.escape(char_set) + ']')
そしてこれも:
regex = re.compile(u'\A[{ }]'.format(char_set))
期待どおりに機能するものはありません。
何かご意見は?私は何を間違っていますか?
(私は Python 2.7 と Mac OS X 10.6 を使用しています)