Найти - Пользователи
Полная версия: Почему при поиске происходит пропуск и как этого избежать?
Начало » Python для новичков » Почему при поиске происходит пропуск и как этого избежать?
1
Kravejs
Есть текст. Нужно найти последовательность, которая начинается определённым образом а заканчивается либо концом файла либо началом следующей последовательности.

Пример:

Мне нужно найти все что начинается на ‘a’, внутри ‘a’ не содержит и заканчивается либо концом строки либо началом другой последовательности.

a = "xcAbbAccAddAvvvAkk"
re.findall(r"(A[^A]*)(A|\Z)", a)
Эта конструкция находит только три слова: Abb, Add, Akk. И пропускает Acc и Avvv.
Почему? Как это обойти?

Конечно, здесь выражение можно переписать как: r"(A*)"

Но в моей задаче начало последовательности несколько сложнее. Это открывающая квадратная скобка в начале строки.

Пример:

a ="""
[aaa] bcd [ss] bbb
bbb ccc
[bbb] llkkk

[ccc] kkk [dddd [ddd] ddd]"""
Последовательность начинается с ^ и заканчивается \n\n | \Z или ^[

И нужно их вытащить и обработать.

Вот
Nik
>>> a = "xcAbbAccAddAvvvAkk"
>>> re.findall(r"(A[^A]*)", a)
['Abb', 'Acc', 'Add', 'Avvv', 'Akk']
>>> re.findall(r"(A[^A]*)(?=A|\Z)", a)
['Abb', 'Acc', 'Add', 'Avvv', 'Akk']
>>> a ="""
[aaa] bcd [ss] bbb
bbb ccc
[bbb] llkkk

[ccc] kkk [dddd [ddd] ddd]"""
>>> re.findall(r"(\[.*?)(?=\n|\Z|\[)", a)
['[aaa] bcd ', '[ss] bbb', '[bbb] llkkk', '[ccc] kkk ', '[dddd ', '[ddd] ddd]']
Kravejs
Спасибо!

Вот ключевая фраза в документации, которую я не понял:

(?=…)
Matches if … matches next, but doesn’t consume any of the string.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB