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

12 投票
4 回答
19082 浏览
提问于 2025-04-15 20:02

有没有办法用一个正则表达式来满足这个条件呢?

我想找一个“单词”,它由字母MBIPI中的三个字母组成,顺序可以随意,但必须包含一个字母I。

比如说:

re.match("[MBDPI]{3}", foo) 并且 "I" 在 foo 中

这样在Python中使用re模块就能得到正确的结果,但我能不能用一个正则表达式来实现这个呢?

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

我知道在正则表达式中可以用 | 来表示“或者”,但有没有类似“并且”的用法呢?

或者我需要用一些前向或后向查找的方式?

4 个回答

5

我知道在正则表达式中可以用 | 来表示“或者”,那么有没有类似的“并且”的表示方法呢?

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

A 和 B 是一些可能有共同部分的表达式。

5

你可以通过使用前瞻来模拟布尔与(AND)。根据这个网站的介绍:http://www.regular-expressions.info/lookaround2.html,这个方法在你的情况下是有效的:

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

或者这就是你能做的唯一事情:

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

\b这个字符用来匹配一个零宽度的单词边界。这意味着你可以确保匹配到的内容正好是三个字符长。

否则,你就会遇到正则语言的局限性。

另一种方法是匹配:

\b[MBDPI]{3}\b

捕获那个组,然后再找一个I。

编辑:为了给出一个完整的答案,我会调整一下Jens的回答,这个回答使用了测试字符串的同一部分以满足多个条件

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

加上单词边界的检查,以确保它的长度只有三个字符。

这是一种稍微复杂一点的解决方案,适用于更多情况,但我个人更倾向于易于阅读的方式(也就是“或”的版本)。

撰写回答