Синтаксис регулярного выражения для "ничего не соответствует"?


У меня есть движок шаблонов python, который сильно использует регулярное выражение. Он использует конкатенацию как:

re.compile( regexp1 + "|" + regexp2 + "*|" + regexp3 + "+" )

Я могу изменять отдельные подстроки (regexp1, regexp2 и т. д.).

есть ли небольшое и легкое выражение, которое ничего не соответствует, которое я могу использовать внутри шаблона, где я не хочу никаких совпадений? К сожалению, иногда ' + ' или ' * ' добавляется к атому регулярного выражения, поэтому я не могу использовать пустую строку - ошибка "нечего повторять" будет расти.

7 53

7 ответов:

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

re.compile('$^')

поэтому, если вы замените regexp1, regexp2 и regexp3 на'$^', будет невозможно найти совпадение. Если вы не используете режиме онлайн.


после некоторых тестов я нашел лучшее решение

re.compile('a^')

невозможно сопоставить и потерпит неудачу раньше, чем предыдущее решение. Вы можете заменить любой другой символ, и это всегда будет невозможно матча

(?!) всегда не совпадают. Это нулевой ширины отрицательный просмотр вперед. Если то, что находится в скобках соответствует, то весь матч не удается. Учитывая, что в нем ничего нет, он потерпит неудачу в матче за что угодно (включая ничто).

чтобы соответствовать пустой строке - даже в многострочном режиме - вы можете использовать \A\Z, так:

re.compile('\A\Z|\A\Z*|\A\Z+')

разница в том, что \A и \Z - начало и конец строка, а ^ и $ они могут соответствовать начало / конец строки, так что $^|$^*|$^+ потенциально может соответствовать строке, содержащей новые строки (если флаг включен).

и чтобы не совпадать ни с чем (даже с пустой строкой), просто попытайтесь найти содержимое до начало строки, например:

re.compile('.\A|.\A*|.\A+')

так как никакие символы не могут предшествовать \A (по определению), это всегда не будет соответствовать.

"()"

ничего не соответствует и только ничего.

может быть '.{0}'?

вы могли бы использовать
\z..
Это абсолютный конец строки, а затем два из ничего

Если + или * прикреплен к концу, это все еще работает, отказываясь соответствовать чему-либо

или используйте некоторое понимание списка, чтобы удалить бесполезные записи регулярных выражений и объединить их все вместе. Что-то вроде:

re.compile('|'.join([x for x in [regexp1, regexp2, ...] if x != None]))

Не забудьте добавить некоторые комментарии рядом с этой строкой кода, хотя: -)