что такое не группирующая версия регулярных скобок

1

Возможный дубликат:
Не захватывающая группа?

Из документа модуля python re я вижу:

(?:...)  Non-grouping version of regular parentheses.

а также

(...)    Matches the RE inside the parentheses.
         The contents can be retrieved or matched later in the string.

В чем разница?

  • 0
    Описание не очень точное в IMO. (?:...) прежнему «группирует» внутреннее выражение некоторым образом (подумайте о (?:...)+ , квантификатор применяется к группе while), но вы не можете ссылаться на сопоставляемое содержимое позже, потому что это не захвачено.
Теги:

3 ответа

3
Лучший ответ

коротко: негруппирование означает, что оно не будет сопоставлено с группой. то есть вы не можете ссылаться на него, например, на \1.

1

Разница в том, что сказал Кент.

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

Кроме того, если вы используете много группировки в своем регулярном выражении, но только некоторые из них должны быть указаны после (для замены текста или по любой причине), то проще иметь только те, которые вам действительно нужны для захвата групп, поэтому вы можете ссылайтесь затем от \1 (или $ 1, зависит),\n, вместо пропусков чисел.

0

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

milk 1.25
bread 1.15
deli meat 5.25
total 7.65

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

  • 1
    Я думаю, что вы путаете группы захвата с внешними взглядами. Группы без захвата становятся частью матча, вы просто не можете получить доступ к их содержимому через обратную ссылку.
  • 0
    @TimPietzcker Зависит от того, как вы их используете. Я почти уверен, что, по крайней мере, в движке регулярных выражений Python не-группирующие совпадения не будут отображаться в .groups() , поэтому, если вы выполняете findall() или что-то в этом роде, оно будет эффективно вести себя так, как я описываю.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню