Почему регулярное выражение не “не получает” работу группы?

В отрывке ниже, негруппа фиксации "(?:aaa)" должен быть проигнорирован в результате соответствия,

Результат должен быть "_bbb" только.

Однако я добираюсь "aaa_bbb" в результате соответствия; только, когда я указываю, что группа (2) делает она показывает "_bbb".

>>> import re
>>> s = "aaa_bbb"
>>> print(re.match(r"(?:aaa)(_bbb)", s).group())

aaa_bbb
44
задан NelsonGon 13 July 2019 в 05:59
поделиться

6 ответов

group () и group (0) вернут полное совпадение. Последующие группы являются фактическими группами захвата.

>>> print (re.match(r"(?:aaa)(_bbb)", string1).group(0))
aaa_bbb
>>> print (re.match(r"(?:aaa)(_bbb)", string1).group(1))
_bbb
>>> print (re.match(r"(?:aaa)(_bbb)", string1).group(2))
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
IndexError: no such group

Если вы хотите того же поведения, что и group () :

"" .join (re.match (r "(?: Aaa) (_ bbb)", string1) .groups () )

42
ответ дан 26 November 2019 в 21:43
поделиться

Попробуйте:

print(re.match(r"(?:aaa)(_bbb)", string1).group(1))

group () совпадает с group (0) и Group 0 присутствует всегда, и это полное соответствие RE .

1
ответ дан 26 November 2019 в 21:43
поделиться

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

Как регулярное выражение (?: aaa) (_ bbb) , так и регулярное выражение (aaa) (_ bbb) возвращают aaa_bbb в качестве общего совпадения. Разница в том, что первое регулярное выражение имеет одну группу захвата, которая возвращает _bbb в качестве совпадения, а второе регулярное выражение имеет две группы захвата, которые возвращают aaa и _bbb как их соответствующие матчи. В коде Python, чтобы получить _bbb , вам нужно будет использовать group (1) с первым регулярным выражением и group (2) со вторым регулярное выражение.

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

Если вы действительно хотите исключить aaa из общего соответствия регулярному выражению, вам нужно использовать lookaround . В этом случае работает положительный просмотр назад: (? <= Aaa) _bbb . С этим регулярным выражением group () возвращает _bbb в Python. Группы захвата не нужны.

Я рекомендую, если у вас есть возможность использовать группы захвата для получения части совпадения регулярного выражения, используйте этот метод вместо поиска.

84
ответ дан 26 November 2019 в 21:43
поделиться

Вы должны указать group (1) , чтобы получить только часть, захваченную круглыми скобками ( _bbb в этом случае).

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

0
ответ дан 26 November 2019 в 21:43
поделиться

TFM :

класс re.MatchObject

group ([group1, ...])

Возвращает одну или несколько подгрупп совпадения. Если есть один аргумент, результатом будет одна строка; если есть несколько аргументов, результатом будет кортеж с одним элементом на аргумент. Без аргументов группа group1 по умолчанию равна нулю (возвращается все совпадение). Если аргумент groupN равен нулю, соответствующее возвращаемое значение является всей совпадающей строкой.

3
ответ дан 26 November 2019 в 21:43
поделиться

Используйте метод групп для объекта соответствия вместо группы. Он возвращает список всех буферов захвата. Групповой метод без аргументов возвращает полное совпадение регулярного выражения.

0
ответ дан 26 November 2019 в 21:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: