Подтвердить что ты не робот

Синтаксис регулярных выражений для "match nothing"?

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

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

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

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

4b9b3361

Ответ 1

Это ничего не должно соответствовать:

re.compile('$^')

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


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

re.compile('a^')

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

Ответ 2

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

Ответ 3

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

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

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

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

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

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

Ответ 4

"()"

ничего не соответствует и ничего.

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

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

Обязательно добавьте несколько комментариев рядом с этой строкой кода: -)