Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.10.2023, 21:03   #11
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Сообщение от Ципихович Эндрю Посмотреть сообщение
но как это мне поможет, чтобы решить задачу
Это поможет вам понять, почему покрасились именно эти буквы, чтобы применить функцию для своей задачи.
Цитата:
Сообщение от Ципихович Эндрю Посмотреть сообщение
найти данные из списка
Вот есть код поиска и замены текста через регулярные выражения. Вместо замены можно попробовать резать и красить run'ы.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 16.10.2023, 21:10   #12
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию

BDA, вы поняли, что сначала в тексте
1234
покрасило в красный цвет текст 123
и получилось 1234
и потом на чёрном фоне НЕ найдёт 234 - следующие данные, что и требуется, тут же регулярка не взлетит, или о чём был совет?
Ципихович Эндрю на форуме Ответить с цитированием
Старый 16.10.2023, 21:25   #13
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Сообщение от Ципихович Эндрю Посмотреть сообщение
регулярка не взлетит
Она и так без ухищрений не будет искать пересекающиеся совпадения и найдет только 123, но не 234.
Код:
import re

s = "1234 234"
for match in re.finditer("123|234", s):
    print(match.start(), match.end())
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 17.10.2023, 07:17   #14
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию

BDA, если дан вордовский файл:
1234 234
1234 234

то есть, дано:
Код:
s = "1234 234\n\
 1234 234"
vFindText = ["123", "234"]
то красть нужно так:
1234 234
1234 234

то даже если регулярка даст ответ 123 и 234 тут же ещё нужно знать какое из 234 красить, а какое нет, как это сделать?
Ципихович Эндрю на форуме Ответить с цитированием
Старый 17.10.2023, 08:31   #15
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию

тут мне помог добрый человек, а ему помог джи пи ти:
Код:
from docx import Document
from docx.shared import RGBColor

# Открываем документ
doc = Document('test1.docx')

# Список текстов для поиска и замены
texts_to_replace = ["123", "234"]

# Итерируемся по всем параграфам документа
for paragraph in doc.paragraphs:
    for text_to_replace in texts_to_replace:
        if text_to_replace in paragraph.text:
            # Найден текст, меняем его цвет на красный
            for run in paragraph.runs:
                if text_to_replace in run.text:
                    run.font.color.rgb = RGBColor(255, 0, 0)  # Используем RGBColor

# Сохраняем измененный документ
doc.save('test1-highlightened.docx')
но в файле выкрасило всё в красный цвет, видимо нужно поправить, поставить условие, что если найденное НЕ чёрного цвета, то красить его Не нужно, не подскажите как?
Ципихович Эндрю на форуме Ответить с цитированием
Старый 17.10.2023, 17:52   #16
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Сообщение от Ципихович Эндрю Посмотреть сообщение
даже если регулярка даст ответ 123 и 234 тут же ещё нужно знать какое из 234 красить, а какое нет
Вы бы запустили пример - start и end дадут индексы.
Цитата:
Сообщение от Ципихович Эндрю Посмотреть сообщение
поставить условие, что если найденное НЕ чёрного цвета
Можно, наверное, проверять значение атрибута run.font.color.rgb, но проблема не в этом. Нельзя покрасить только часть run'а. Если искомый текст есть в run'е (if text_to_replace in run.text), то нужно разрезать его на 2 (если текст в начале или конце) или 3 run'а (если текст в середине) и покрасить нужный run. А еще возможна ситуация, что после первоначальной перекраски текста в черный цвет искомый текст находится в нескольких соседних run'ах, и тогда предложенный поиск его не найдет, а пример от scanny учитывает такой случай.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 17.10.2023 в 17:54.
BDA вне форума Ответить с цитированием
Старый 17.10.2023, 20:39   #17
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Вы бы запустили пример - start и end дадут индексы
правильно понял?
Код:
s = "1234 234\n\
 1234 234"
vFindText = ["123", "234"]
print("ДАНО:")
print(s)
print(vFindText)
print("=================================")
import re
for val in vFindText:
    print("Значение:", val, "из:", vFindText)
    for match in re.finditer(val, s):
        print(match.start(), match.end())
ответ:
1234 234
_1234 234
['123', '234']
=================================
Значение: 123 из: ['123', '234']
0 3
10 13
Значение: 234 из: ['123', '234']
1 4
5 8
11 14
15 18
если правильно понял, то верные индексы?
там где ставил розового цвета _ это пробел, просто в сообщение форума он съедается...

Последний раз редактировалось Ципихович Эндрю; 17.10.2023 в 20:42.
Ципихович Эндрю на форуме Ответить с цитированием
Старый 17.10.2023, 21:18   #18
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Сообщение от Ципихович Эндрю Посмотреть сообщение
верные индексы?
Похоже на правду. Но если искать каждый текст отдельно, то возможны пересечения. Можно сразу всё искать:
Код:
import re

s = "1234 234\n\
 1234 234"
vFindText = ["123", "234"]
print("ДАНО:")
print(s)
print(vFindText)
print("=================================")

for match in re.finditer("|".join(vFindText), s):
    print(match.group(0), match.start(), match.end())
А если в искомом тексте возможны символы, которые используются в регулярных выражениях, то:
Код:
# заменить
"|".join(vFindText)
# на
"|".join(map(re.escape, vFindText))
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 18.10.2023, 08:05   #19
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию

ну взял вариант
Цитата:
Сообщение от BDA Посмотреть сообщение
если в искомом тексте возможны символы, которые используются в регулярных выражениях
Код:
import re

s = "1234 234\n\
 1234 234"
vFindText = ["123", "234"]
print("ДАНО:")
print(s)
print(vFindText)
print("=================================")

for match in re.finditer("|".join(map(re.escape, vFindText)), s):
    print(match.group(0), match.start(), match.end())
ответ
....
=================================
123 0 3
234 5 8
123 10 13
234 15 18

я правильно понял, что:
нужно покрасить "123" с индексами 0-3 тут всё понятно, видимо отсчёт от нуля
нужно покрасить "234" с индексами 5-8 тут не понятно
1234_234
получится что нужно красить пробел+2+3 но это же не так
пробел тоже для наглядности заменил на _
Ципихович Эндрю на форуме Ответить с цитированием
Старый 18.10.2023, 08:10   #20
Ципихович Эндрю
Старожил
 
Регистрация: 24.01.2011
Сообщений: 3,043
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
пример от scanny
ок прочту топик: Can search and replace functions be added to python-docx=Можно ли добавить функции поиска и замены в python-docx
там же у него несколько выложено-какой смотреть?
читаю с переводчиком))
Ципихович Эндрю на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Шрифт текста в файле пдф Alifhan Фриланс 2 24.08.2019 11:21
изменить шрифт detalik Помощь студентам 2 15.04.2011 16:22
Как изменить шрифт FIREVISTA Общие вопросы C/C++ 12 24.04.2010 19:08
Искаженный шрифт в скомпилированном файле справки Fantom Общие вопросы Delphi 0 19.09.2008 12:51
ШРИФТ в файле справки prog38 Помощь студентам 7 13.09.2008 08:36