如何在正则表达式中包含一个布尔型AND?

2024-05-16 01:15:53 发布

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

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

我在找一个有三个字母的单词,任何顺序, 但必须包含一个I

重新匹配foo中的(“[MBDPI]{3}”,foo)和“I”

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

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

有了正则表达式,我知道我可以使用|作为布尔或运算符,但是否有布尔和等价的?

或者我需要一些正向或反向查找?


Tags: inretruefoo条件ibmmibprint
3条回答

您可以使用lookahead查看是否存在I

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

您可以通过使用lookaheads来伪造布尔值。根据http://www.regular-expressions.info/lookaround2.html,这将适用于您的案例:

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

或者你唯一能做的就是:

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

\b字符与零宽度字边界匹配。这样可以确保匹配的字符长度正好是三个字符。

否则,您将遇到regular language所能做的限制。

另一种选择是匹配:

\b[MBDPI]{3}\b

抓住那群人,然后找一个I

编辑:为了得到完整的答案,我将调整使用Testing The Same Part of a String for More Than One RequirementJens' answer

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

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

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

相关问题 更多 >