2015-12-21 1 views
3

В моем коде я генерирую регулярное выражение из списка подвыражений. Объединение выражений отлично работает, если я ставлю каждый из них в несоответствующей группе (?:…):Регулярное выражение, которое не может соответствовать (для сгенерированного выражения)

# concatenation: 
joined_expr = ''.join('(?:{})'.format(expr) for expr in subexpression) 
# disjunction: 
joined_expr = '|'.join('(?:{})'.format(expr) for expr in subexpression) 

Проблема: В результате этого присоединилось выражение подвыражения для большего выражения, и subexpression может быть пустым, но Объединенное выражение не должно совпадать с пустой строкой.

Так что было бы проще всего сделать регулярным выражением, которое не может соответствовать? Будет (?:(?!.).) работы? Если нет, почему бы и нет? Может ли Python's re понять мою попытку создать отказоустойчивую ветвь и оптимизировать ее?

+1

Имеет ли значение, если оно соответствует пустой строке, если оно помечено как не захватывая группы? –

+0

'join_expr' будет использоваться в конкатенированном выражении, которое является ветвью дизъюнкции. Эта ветка не должна совпадать (т. Е. Должна завершиться с ошибкой). Здесь я использовал слово «match» как «не подведет». – kay

+0

Если вы хотите не выполнять операцию над результирующей строкой, если она равна нулю, почему бы просто не пропустить re и не выполнить 'match = regex.match (string); if match & bool (string): do_code' Это намного проще и, вероятно, быстрее, чем проверка пустой строки через re для комбинированного условия. –

ответ

4

выкроить время, прошедшее с помощью регулярных выражений с использованием:

\Zx # or '$s' to match a literal after the end of the string 

Это гораздо проще, чем (?:(?!.).) для длинных строк и вы получите тот же результат.

Вот короткий тест онлайн с текстом 4231 символов:

+0

Ничего себе, спасибо! '\ Zx' именно то, что я искал! – kay

0

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

Если вы хотите, чтобы сбой согласования в какой-то момент в шаблон, наиболее удобный способ сделать это с (?!), потому что пустая строка всегда совпадает, поэтому утверждение, что требует не быть пустой строкой должен всегда терпеть неудачу. Контрольный глагол обратного слежения (*FAIL) или (*F) является синонимом для (?!).

- http://www.pcre.org/current/doc/html/pcre2pattern.html