Я думаю, что вы неправильно понимаете концепцию "группы без захвата". Текст, сопоставленный группой без захвата, по-прежнему становится частью общего соответствия регулярному выражению.
И регулярное выражение (?:aaa)(_bbb)
, и регулярное выражение (aaa)(_bbb)
возвращают aaa_bbb
в качестве общего совпадения. Разница в том, что первое регулярное выражение имеет одну группу захвата, которая возвращает _bbb
в качестве своего совпадения, в то время как второе регулярное выражение имеет две группы захвата, которые возвращают aaa
и _bbb
в качестве их соответствующих совпадений. В вашем коде Python, чтобы получить _bbb
, вам нужно использовать group(1)
с первым регулярным выражением и group(2)
со вторым регулярным выражением.
Основным преимуществом групп без захвата является то, что вы можете добавить их в регулярное выражение, не нарушая нумерацию групп захвата в регулярном выражении. Они также предлагают (немного) лучшую производительность, так как движку регулярных выражений не нужно отслеживать текст, соответствующий группам без захвата.
Если вы действительно хотите исключить aaa
из общего соответствия регулярному выражению, тогда вам нужно использовать lookaround . В этом случае позитивный взгляд делает свое дело: (?<=aaa)_bbb
. С этим регулярным выражением group()
возвращает _bbb
в Python. Группы захвата не нужны.
Моя рекомендация заключается в том, что если у вас есть возможность использовать группы захвата для получения части соответствия регулярному выражению, используйте этот метод вместо lookaround.