В моем коде я генерирую регулярное выражение из списка подвыражений. Объединение выражений отлично работает, если я ставлю каждый из них в несоответствующей группе (?:…)
:Регулярное выражение, которое не может соответствовать (для сгенерированного выражения)
# concatenation:
joined_expr = ''.join('(?:{})'.format(expr) for expr in subexpression)
# disjunction:
joined_expr = '|'.join('(?:{})'.format(expr) for expr in subexpression)
Проблема: В результате этого присоединилось выражение подвыражения для большего выражения, и subexpression
может быть пустым, но Объединенное выражение не должно совпадать с пустой строкой.
Так что было бы проще всего сделать регулярным выражением, которое не может соответствовать? Будет (?:(?!.).)
работы? Если нет, почему бы и нет? Может ли Python's re
понять мою попытку создать отказоустойчивую ветвь и оптимизировать ее?
Имеет ли значение, если оно соответствует пустой строке, если оно помечено как не захватывая группы? –
'join_expr' будет использоваться в конкатенированном выражении, которое является ветвью дизъюнкции. Эта ветка не должна совпадать (т. Е. Должна завершиться с ошибкой). Здесь я использовал слово «match» как «не подведет». – kay
Если вы хотите не выполнять операцию над результирующей строкой, если она равна нулю, почему бы просто не пропустить re и не выполнить 'match = regex.match (string); if match & bool (string): do_code' Это намного проще и, вероятно, быстрее, чем проверка пустой строки через re для комбинированного условия. –