Как включить логическое И в регулярное выражение? - PullRequest
5 голосов
/ 05 марта 2010

Есть ли способ получить одно регулярное выражение для удовлетворения этого условия ??

Я ищу "слово", которое имеет три буквы из установленного 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 ]

3 голосов
/ 05 марта 2010

Вы можете подделать логическое И с помощью lookaheads. Согласно http://www.regular -expressions.info / lookaround2.html , это будет работать для вашего случая:

"\b(?=[MBDPI]{3}\b)\w*I\w*"
2 голосов
/ 05 марта 2010

Вы можете использовать lookahead для проверки наличия I:

(?=[MBDPI]{0,2}I)[MBDPI]{3}
2 голосов
/ 05 марта 2010

Или это единственное, что вы можете сделать:

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

Символ \b соответствует границе слова нулевой ширины. Это гарантирует, что вы соответствуете чему-то, что ровно три символа длиной.

В противном случае вы сталкиваетесь с тем, что может * обычный язык .

Альтернатива должна соответствовать:

\b[MBDPI]{3}\b

захватите эту группу и затем найдите I.

Редактировать: ради полного ответа, я адаптирую ответ Йенса , который использует Тестирование одной и той же части строки для более чем одного требования

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

с проверкой границы слова, чтобы гарантировать, что это только три символа.

Это немного более продвинутое решение, которое применимо в большинстве ситуаций, но я бы предпочел, чтобы его было легче читать (будь то "или" версия imho).

1 голос
/ 10 января 2014

с регулярным выражением, я знаю, что могу использовать | в качестве логического оператора ИЛИ, но есть ли логическое И эквивалент?

A и B = нет (не A или не B) = (?! [^ A] | [^ B])

A и B - выражения, которые на самом деле могут иметь общих членов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...