无法在regex中使用变量

2024-04-20 06:28:12 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,我有一系列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代码而不是字符串文本。)

如果我直接编译那个长字符串,它就可以工作了。例如,这与以其中一个字符开头的所有单词匹配:

^{pr2}$

但是我想在其他几个正则表达式中重新使用相同的字符序列。我可以每次复制粘贴,但那很难看。因此,基于之前对类似问题的回答,我尝试过:

^{cd1>}

不好。不知怎么,上面的表达式似乎匹配任何字符,而不仅仅是在变量“char\u set”下硬编码的字符。

我也试过:

^{cd2>}

这:

^{cd3>}

这也是:

^{cd4>}

没有一个能按预期工作。

有什么想法吗?我做错什么了?

(我使用的是Python 2.7和Mac OS X 10.6)


Tags: 字符串unicode字符setcharu0041u005au0100
1条回答
网友
1楼 · 发布于 2024-04-20 06:28:12

当您使用方括号中包含一组字符的模式时,您不希望在集中放置任何竖线(|)字符。相反,只要把字符串在一起就可以了。在这节课上,我在去掉|字符后,毫无问题地试用了你的字符:

>>> 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

编辑:事实上,似乎还存在其他问题,因为我不匹配"%foo",即使我使用了您的原始字符集而不剥离任何内容。请举例说明不应该匹配的文本!在

相关问题 更多 >