Синтаксис регулярных выражений для "match nothing"?
У меня есть механизм шаблонов python, который сильно использует regexp. Он использует конкатенацию, например:
re.compile( regexp1 + "|" + regexp2 + "*|" + regexp3 + "+" )
Я могу изменить отдельные подстроки (regexp1, regexp2 и т.д.).
Есть ли какое-либо маленькое и легкое выражение, которое ничего не соответствует, которое я могу использовать внутри шаблона, где мне не нужны совпадения? К сожалению, иногда к ядру regexp добавляется "+" или "*", поэтому я не могу использовать пустую строку - ошибка "ничего не повторится" будет расти.
Ответы
Ответ 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]))
Обязательно добавьте несколько комментариев рядом с этой строкой кода: -)