2014-04-10 3 views
-2

Я видел регулярное выражение (?= (?:\d{5}|[A-Z]{2})) в примере python и был очень смущен о значении ?:.python re?: Example

Я также вижу питона документ, есть объяснения:

(?:...)

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

кто может дать мне пример и объяснить, почему он работает, спасибо!

+0

ли вы сначала проверяете документы? – Jerry

+0

Это способ группировать вещи, когда вас не волнует захват группы. Документ ... подвел итог этому довольно хорошо. – roippi

ответ

0

Если вам не нужна группа для ее соответствия, вы можете оптимизировать это регулярное выражение в Set (?: Value) ?. Знак вопроса и столбец после открывающей скобки являются синтаксисом, который создает группу, не захватывающую . Вопросительный знак после открывающей скобки равен , не связанный с вопросительным знаком в конце регулярного выражения. Конечный вопросительный знак - это квантификатор, который делает предыдущий токен необязательным. Этот квантификатор не может появиться после открывающей скобки, , потому что в начале группы ничего не нужно делать необязательным. Таким образом, между вопросительным знаком не существует двусмысленности в качестве оператора , чтобы сделать маркер необязательным и вопросительный знак как часть синтаксиса для групп, не связанных с захватом, хотя это может сбивать с толку в . Есть и другие виды групп, которые используют (синтаксис в сочетании с другими символами, чем толстой кишки, которые объясняются позже в этом руководстве

цвет = (?: красный |?. Зеленый | синий) является еще регулярное выражение с без захвата группы Это регулярное выражение не имеет кванторов

От:.. http://www.regular-expressions.info/brackets.html

Также читайте: What is a non-capturing group? What does a question mark followed by a colon (?:) mean?

1

Обычно круглые скобки создают «capturi группа нг»внутри регулярного выражения:

regex = re.compile("(set|let) var = (\\w+|\\d+)") 
print regex.match("set var = 12").groups() 

результаты

('set', '12') 

Позже вы можете получить эти группы с помощью вызова метода .groups() на результат матча. Как вы видите все, что находится в круглых скобках, фиксируется в «группах». Но вам могут не нравиться все эти группы. Скажем, вы только хотите найти то, что находится во второй группе, а не первое. Вам нужно первый набор скобок для того, чтобы группа «получить» и «установить», но вы можете отключить захват, поставив «:» в начале:

regex = re.compile("(?:set|let) var = (\\w+|\\d+)") 
print regex.match("set var = 12").groups() 

результаты:

('12',) 
+0

хорошо, большое спасибо – Thompson