У меня есть шаблонизатор Python, который активно использует регулярное выражение. Он использует конкатенацию, например:
re.compile( regexp1 + "|" + regexp2 + "*|" + regexp3 + "+" )
Я могу изменить отдельные подстроки (regexp1, regexp2 и т. Д.).
Есть ли какое-нибудь маленькое и легкое выражение, которое ничего не соответствует, которое я могу использовать внутри шаблона, где мне не нужны совпадения? К сожалению, иногда к атому регулярного выражения добавляется «+» или «*», поэтому я не могу использовать пустую строку - это вызовет ошибку «нечего повторять».
Ответы:
Это не должно ничего совпадать:
re.compile('$^')
Поэтому, если вы замените regexp1, regexp2 и regexp3 на '$ ^', будет невозможно найти совпадение. Если вы не используете многострочный режим.
После некоторых тестов я нашел лучшее решение
re.compile('a^')
Сопоставить невозможно и выйдет из строя раньше, чем предыдущее решение. Вы можете заменить a любым другим символом, и всегда будет невозможно сопоставить
источник
QtCore.QRegExp
. Настолько плохо, что наверняка было бы легче казнить.(?!)
всегда не должно совпадать. Это отрицательный прогноз нулевой ширины. Если то, что указано в скобках, совпадает, то все совпадение не выполняется. Учитывая, что в нем ничего нет, он не сможет найти ничего (включая ничего).источник
Чтобы сопоставить пустую строку - даже в многострочном режиме - вы можете использовать
\A\Z
, поэтому:re.compile('\A\Z|\A\Z*|\A\Z+')
Разница в том, что
\A
и\Z
являются началом и концом строки , в то время как^
и$
они могут соответствовать началу / концу строк , поэтому$^|$^*|$^+
потенциально может соответствовать строке, содержащей новые строки (если флаг включен).И чтобы ничего не найти (даже пустая строка), просто попытайтесь найти содержимое до начала строки, например:
re.compile('.\A|.\A*|.\A+')
Поскольку перед \ A не может быть никаких символов (по определению), это всегда не соответствует.
источник
Может быть
'.{0}'
?источник
Вы можете использовать
\z..
Это абсолютный конец строки, за которым следуют два любых
Если
+
или*
прикреплен к концу, это все еще работает, отказываясь соответствовать чему-либоисточник
\z
не позволяет завершать символы новой строки, в отличие от этого\Z
, разве не хватит одной? Или это странная защита против*
(почему вы остерегаетесь этого?)Или используйте некоторое понимание списка, чтобы удалить бесполезные записи регулярного выражения, и соедините их, чтобы собрать их все вместе. Что-то вроде:
re.compile('|'.join([x for x in [regexp1, regexp2, ...] if x != None]))
Не забудьте добавить комментарии рядом с этой строкой кода :-)
источник