Позитивный взгляд против группы без захвата: другое поведение

Я использую регулярные выражения Python (re модуль) в моем коде и заметил другое поведение в этих случаях:

re.findall(r'\s*(?:[a-z]\))?[^.)]+', 'a) xyz. b) abc.') # non-capturing group
# results in ['a) xyz', ' b) abc']

а также

re.findall(r'\s*(?<=[a-z]\))?[^.)]+', 'a) xyz. b) abc.') # lookbehind
# results in ['a', ' xyz', ' b', ' abc']

То, что мне нужно, это просто ['xyz', 'abc'], Почему примеры ведут себя по-разному и как получить желаемый результат?

2 ответа

Решение

Причина a а также b включены во втором случае, потому что (?<=[a-z]\)) сначала найдет a) и так как lookaround не потребляет никаких символов, вы вернулись в начале строки. Теперь [^.)]+ Матчи a

Теперь вы находитесь в ). Так как вы сделали (?<=[a-z]\)) необязательный [^.)]+ Матчи xyz

То же самое повторяется с b) abc

Удалить ? из второго случая, и вы получите ожидаемый результат, т.е. ['xyz', 'abc']

Регулярное выражение, которое вы ищете:

re.findall(r'(?<=[a-z]\) )[^) .]+', 'a) xyz. b) abc.')

Я полагаю, что принятый в настоящее время ответ Анирудхи объясняет разницу между вашим положительным взглядом сзади и отсутствием захвата, однако, предложение об удалении ? после того, как положительный взгляд позади фактически приводит к [' xyz', ' abc'] (обратите внимание на включенные пробелы).

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

Другие вопросы по тегам