python - 无法在正则表达式中使用变量

标签 python regex python-2.7

所以,我有一个很长的 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)

最佳答案

当您使用包含方括号中的一组字符的模式时,您不希望在该组中放置任何竖线 (|) 字符。相反,只需将字符串在一起就可以了。在下面的 session 中,我在删除 | 字符后尝试了您的字符,没有出现任何问题:

>>> import re
>>> char_set = u'\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'
>>> fixed_char_set = char_set.replace("|", "")   # remove the unneeded vertical bars
>>> pattern = ur"\A[{}]".format(fixed_char_set)  # create a pattern string
>>> regex = re.compile(pattern) # compile the pattern into a regex object
>>> print regex.match("%foo")   # "%" is not in the character set, so match returns None
None

编辑:实际上,似乎肯定还有其他问题发生,因为即使我使用您的原始 char_set 而不删除任何内容,我也不匹配 "%foo" 。请举例说明不应该匹配的文本!

关于python - 无法在正则表达式中使用变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17387074/

相关文章:

python - Exscript:如何在交互式和非交互式 session 之间切换?

python - 通过代码或者注册表获取已安装的office版本

python - 在破折号后使用逗号但不反转时在正则表达式中得到 `bad character range`

python - 获取非默认的函数参数

python - 在 Python 中,如何打印列表中的值

python - 字符串python的重新/正则表达式模式

c# - 护照号码的正则表达式

RegExp - 捕获所有以冒号结尾的单词

Django 用户注册问题

python - 为什么我的 Python 自定义数学重载类方法不起作用?