如何在正则表达式中包含布尔值?

时间:2010-03-05 09:47:25

标签: python regex

有没有办法让单个正则表达式满足这个条件?

我正在寻找一个“字”,其中包含来自MBIPI集的三个字母,任何订单, 但必须包含一个I.

re.match(“[MBDPI] {3}”,foo)和foo中的“我”

所以这是正确的结果(在使用re模块的python中),但是我可以从单个正则表达式得到这个吗?

>>> for foo in ("MBI", "MIB", "BIM", "BMI", "IBM", "IMB", "MBD"):
...     print foo,
...     print re.match("[MBDPI]{3}", foo) and "I" in foo
MBI True
MIB True
BIM True
BMI True
IBM True
IMB True
MBD False

使用正则表达式我知道我可以使用|作为布尔OR运算符,但是有一个布尔AND等价?

或者我需要一些向前或向后查找?

4 个答案:

答案 0 :(得分:3)

您可以使用前瞻来伪造布尔值。根据{{​​3}},这适用于您的情况:

"\b(?=[MBDPI]{3}\b)\w*I\w*"

答案 1 :(得分:2)

或者是你唯一可以做的事情:

\b(I[MBDPI]{2}|[MBDPI]I[MBDPI]|[MBDPI]{2}I)\b

\b字符与零宽度字边界匹配。这可以确保您匹配正好三个字符的内容。

你正在遇到regular language可以做的限制。

另一种方法是匹配:

\b[MBDPI]{3}\b

捕获该组,然后寻找I。

编辑:为了获得完整的答案,我将调整使用Jens' answerTesting The Same Part of a String for More Than One Requirement

\b(?=[MBDPI]{3}\b)\w*I\w*

使用单词边界检查以确保它只有三个字符长。

这是一个更高级的解决方案,适用于更多情况但我通常更喜欢更容易阅读(作为“或”版本imho)。

答案 2 :(得分:2)

您可以使用预测来查看是否存在I

(?=[MBDPI]{0,2}I)[MBDPI]{3}

答案 3 :(得分:1)

  

使用正则表达式我知道我可以使用|作为布尔OR运算符,但是有一个布尔AND等价?

A和B =不(不是A或不是B)=(?![^ A] | [^ B])

A和B是实际上可能有成员共同的表达。