В вашем вызове re.sub () нужно учесть три случая удаления строк с буквой ab:
- шаблонов, за которыми следует символ конца строки (eol)
- последняя строка в тексте (без завершающего eol)
- , когда есть только одна строка без завершающего eol
Во втором случае вы хотите удалитьпредыдущий символ eol, чтобы избежать создания пустой строки.Третий случай выдаст пустую строку, если есть «b».
Жадность регулярных выражений введет четвертый случай, потому что не может быть никаких перекрытий шаблонов.Если ваша последняя строка содержит «b», а предыдущая строка также содержит «b», то в случае # 1 будет использован символ eol в предыдущей строке, поэтому он не сможет определить шаблон в последней строке (то есть eol, сопровождаемый образцом в конце текста).Эту проблему можно устранить путем очистки (случай № 1) последовательных совпадающих строк в качестве группы и включения последней строки в качестве необязательного компонента этой группы.Что бы это ни пропускало, это будут задние строки (случай № 2), где вы хотите удалить предыдущий eol, а не следующий.
Для управления повторением шаблона линии .*b.*
вам необходимо собрать шаблон поиска из двух частей: шаблона линии и шаблона списка, который использует его несколько раз.Так как мы уже глубоко разбираемся в регулярных выражениях, почему бы не использовать re.sub () для этого.
import re
LinePattern = "(.*b.*)"
ListPattern = "(Line\n)+(Line$)?|(\nLine$)|(^Line$)" # Case1|Case2|Case3
Pattern = re.sub("Line",LinePattern,ListPattern)
String = "aba\naaa\naba\naaa\naba"
cleaned = re.sub(Pattern,"",String)
Примечание: этот метод также будет работать с другим символом разделения (например,запятая вместо eol), но символ должен быть исключен из шаблона линии (например, ([^,]*b[^,]*)
)