如何在正则表达式中包含布尔与?
有没有办法用一个正则表达式来满足这个条件呢?
我想找一个“单词”,它由字母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*
加上单词边界的检查,以确保它的长度只有三个字符。
这是一种稍微复杂一点的解决方案,适用于更多情况,但我个人更倾向于易于阅读的方式(也就是“或”的版本)。