有没有办法让单个正则表达式满足这个条件?
我正在寻找一个“字”,其中包含来自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等价?
或者我需要一些向前或向后查找?
答案 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' answer的Testing 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是实际上可能有成员共同的表达。