所以,我有一长串想要使用正则表达式匹配的 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)