Синтаксис регулярного выражения для «ничего не соответствует»? - PullRequest
61 голосов
/ 02 июня 2009

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

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

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

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

Ответы [ 6 ]

91 голосов
/ 02 июня 2009

Это не должно совпадать:

re.compile('$^')

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


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

re.compile('a^')

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

28 голосов
/ 03 июня 2009

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

15 голосов
/ 02 июня 2009

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

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

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

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

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

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

3 голосов
/ 02 июня 2009

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

1 голос
/ 02 июня 2009

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

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

0 голосов
/ 03 июня 2009

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

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

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

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