2015-02-17 4 views
1

Я использую |, как OR, и сделать одну группу с обеих сторон |. Интересно, почему группа не захвачена в m.group(1)? Благодарю.Группировка и OR в регулярных выражениях

Редактировать: Я хочу совместить одно регулярное выражение (с одной группой) в тексте. Я также хочу сопоставить другое выражение (с одной группой) в тексте. Какой бы регрекс не совпадал сначала в тексте, я выберу группу этого соответствия (т. Е. Если бы я соответствовал каждому регулярному выражению отдельно, я бы выбрал группу 1 совпадающего регулярного выражения). Я думал, что оба регрекса будут работать. Но это не так, что бы вы сделали, если бы вы были мной?

+0

Поскольку группа 1 не содержит подходящий шаблон в 'б A' – hwnd

+0

мы можем использовать единственный путь, чтобы обратиться к группе по бокам, которая соответствует? См. Мое редактирование. – Tim

ответ

4

Единственный способ - это функция branch reset с использованием модуля P.

>>> import regex 
>>> m = regex.search(r'(?|a+(\sb)|b+(\sa))', 'b a') 
>>> m.group() 
'b a' 
>>> m.group(1) 
' a' 
>>> m = regex.search(r'(?|a+(\sb)|b+(\sa))', 'a b') 
>>> m.group() 
'a b' 
>>> m.group(1) 
' b' 

Как указано в документации:

номера групп будут повторно использоваться в различных отраслях сброса филиала ... например. (?|(first)|(second)) имеет только группу 1.

Условное регулярное выражение считается дубликатом подшаблона группы один и то же число в любых подмасках в (..) в такой группе. Если условие выполнено, используется первый шаблон; в противном случае используется второй шаблон.

+0

Спасибо. но я хочу только захватить часть любой стороны, а не всю ее сторону. – Tim

+0

Спасибо. Сайт хорош. Но есть ли книги, в которых упоминается сброс ветвей? Я искал в некоторых книгах (не обязательно регулярное выражение Python), но не нашел их. Может быть, другое имя? Или это новая функция в регулярном выражении (не обязательно регулярное выражение Python)? – Tim

+0

[Более ранняя ссылка] (http://www.regular-expressions.info/branchreset.html) также хороша, и я надеюсь, как загрузить страницы в виде книги, но не знаю, как это сделать. (Не можете позволить себе пожертвование) – Tim

1

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

1

У вашего регулярного выражения две группы. Вам нужно распечатать вторую группу, потому что вторая группа выполняет захват.

>>> import re 
>>> p='a+(\sb)|b+(\sa)' 
>>> m=re.search(p, 'b a') 
>>> m.group() 
'b a' 
>>> m.group(1) 
>>> m.group(2) 
' a' 
>>> m=re.search(p, 'a b') 
>>> m.group() 
'a b' 
>>> m.group(1) 
' b' 
>>> m.groups() 
(' b', None) 

Используйте groups(), чтобы распечатать все содержимое группы.

Update:

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

>>> def extract_group(tup): 
     return [i for i in tup if i is not None] 

>>> p='a+(\sb)|b+(\sa)' 
>>> m=re.search(p, 'b a') 
>>> m.group() 
'b a' 
>>> print(extract_group(m.groups())) 
[' a'] 
>>> m=re.search(p, 'a b') 
>>> print(extract_group(m.groups())) 
[' b'] 
+0

можно ли использовать один способ ссылки на группу по бокам, которая соответствует? – Tim

+0

, если вы не знаете, какая группа выполняет захват, тогда вы можете использовать функцию 'groups()', как указано выше. –

+0

@Tim Что именно вы пытаетесь сделать? Ваш RegEx в порядке, вам просто нужно понять, как Python представляет группы. – thefourtheye

Смежные вопросы