Позитивный взгляд против группы без захвата: другое поведение
Я использую регулярные выражения 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
в основном классе соответствия символов.