Условные регулярные выражения - PullRequest
4 голосов
/ 29 апреля 2010

Я использую Python и хочу использовать регулярные выражения, чтобы проверить, является ли что-то «частью списка включения», но «не является частью списка исключения».

Мой список включения представлен регулярным выражением, например:

And.*

Все, что начинается с И .

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

(?!Andrea)

Все, кроме строки Андреа . список исключений , очевидно, является отрицанием.

Например, используя два приведенных выше примера, я хочу сопоставить все, что начинается с и , за исключением Andrea .

В общем случае у меня есть includeRegEx и excludeRegEx . Я хочу сопоставить все, что соответствует includeRegEx , но не соответствует excludeRegEx . Внимание : excludeRegEx все еще находится в отрицательной форме (как вы можете видеть в приведенном выше примере), поэтому лучше сказать: если что-то совпадает includeRegEx Я проверяю, соответствует ли оно excludeRegEx , если оно совпадает, совпадение удовлетворяется. Можно ли представить это в одном регулярном выражении?

Я думаю, что условные регулярные выражения могут быть решением, но я не совсем уверен в этом.

Я бы хотел увидеть рабочий пример на Python.

Большое спасибо.

1 Ответ

2 голосов
/ 29 апреля 2010

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

And(?!rea$).*

Поскольку lookahead только «смотрит вперед», не потребляя каких-либо символов, это прекрасно работает (ну, на самом деле, в этом весь смысл обхода).

Итак, в Python:

if re.match(r"And(?!rea$).*", subject):
    # Successful match 
    # Note that re.match always anchor the match
    # to the start of the string.
else:
    # Match attempt failed

Судя по формулировке вашего вопроса, я не уверен, что вы начинаете с двух уже готовых списков пар "совпадать / не совпадать". В этом случае вы можете просто объединить их автоматически, объединяя регулярные выражения. Это работает так же хорошо, но уродливее:

(?!Andrea$)And.*

В общем, тогда:

(?!excludeRegex$)includeRegex
...