有没有办法让单个正则表达式满足这个条件?
我正在寻找一个"字",其中有三个字母来自MBIPI集,任何订单,但必须包含一个.
即.
foo中的re.match("[MBDPI] {3}",foo)和"I"
所以这是正确的结果(在使用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
Run Code Online (Sandbox Code Playgroud)
与正则表达式我知道我可以使用| 作为布尔OR运算符,但是有一个布尔AND等价?
或者我可能需要一些向前或向后查找?
您可以使用前瞻来伪造布尔 AND。根据http://www.regular-expressions.info/lookaround2.html,这适用于您的情况:
"\b(?=[MBDPI]{3}\b)\w*I\w*"
Run Code Online (Sandbox Code Playgroud)
与正则表达式我知道我可以使用 | 作为布尔 OR 运算符,但是是否有等效的布尔 AND 运算符?
A 和 B = 不(非 A 或非 B)= (?![^A]|[^B])
A 和 B 是实际上可能具有共同成员的表达式。
或者是你唯一能做的事情:
\b(I[MBDPI]{2}|[MBDPI]I[MBDPI]|[MBDPI]{2}I)\b
Run Code Online (Sandbox Code Playgroud)
该\b字符与零宽度字边界匹配。这可确保您匹配正好三个字符长的内容。
否则你就会遇到常规语言的极限。
另一种方法是匹配:
\b[MBDPI]{3}\b
Run Code Online (Sandbox Code Playgroud)
捕获该组,然后寻找 I。
编辑:为了获得完整的答案,我将改编Jens 的答案,该答案使用测试字符串的同一部分以满足多个要求:
\b(?=[MBDPI]{3}\b)\w*I\w*
Run Code Online (Sandbox Code Playgroud)
进行单词边界检查以确保其长度仅为三个字符。
这是一个更高级的解决方案,适用于更多情况,但我通常更喜欢更容易阅读的解决方案(恕我直言,是“或”版本)。
| 归档时间: |
|
| 查看次数: |
8623 次 |
| 最近记录: |