@ usr2564301 находится на правильном пути. Форматирование символов (aka. «Шрифт») указывается на уровне выполнения. Вот что такое бег; "последовательность" (последовательность) символов, все с одинаковым форматированием символов.
Когда вы назначаете shape.text
, вы заменяете все серии, которые были там, одним новым циклом, имеющим форматирование по умолчанию. Если вы хотите сохранить форматирование, вам нужно сохранить все те прогоны, которые непосредственно не участвуют в замене текста.
Это не тривиальная проблема, потому что нет гарантийных разрывов прогонов на границах слов. Попробуйте распечатать прогоны для нескольких абзацев, и я думаю, вы поймете, что я имею в виду.
В грубом псевдокоде, я думаю, что такой подход вам потребуется:
- выполните поиск целевого текста в абзаце, чтобы определить смещение его первого символа.
- проследите все серии в абзаце, сохранив промежуточную сумму количества символов перед каждым циклом, возможно, что-то вроде (run_idx, prefix_len, length): (0, 0, 8), (1, 8, 4), (2, 12, 9) и др. c.
- Определите, какой прогон является стартовым, конечные и промежуточные запуски, включающие строку поиска.
- Разделить первый прогон в начале поискового термина, разделить последний прогон в конце поискового термина и удалить все, кроме первого из "средние" прогоны.
- Измените текст промежуточного прогона на текст замены и клонируйте форматирование из предыдущего (оригинального запуска) прогона. Может быть, это последний бит, который вы делаете во время начала разделения.
Это сохраняет все запуски, которые не включают строку поиска, и сохраняет форматирование "совпадающего" слова в слове "заменено".
Для этого требуется несколько операций, которые напрямую не поддерживаются текущим API. Для тех, кому нужно использовать низкоуровневые вызовы lxml
, чтобы напрямую манипулировать XML, хотя вы можете получить все существующие элементы, которые вам нужны, от python-pptx
объектов без необходимости разбора в XML сами.