Скрипт на Python 3 читает файл построчно, обрабатывает строки и записывает результат также построчно в новый файл.
import re
input_file = open('in.txt', 'r')
output_file = open('out.txt', 'w')
pattern = re.compile(r'#\w{6}')
for line in input_file:
colors = pattern.findall(line)
if not colors:
output_file.write(line)
else:
for color in colors:
inverted_color = '#'+str(color)[1:7].upper()
new_line = line.replace(color, inverted_color)
output_file.write(new_line)
input_file.close()
output_file.close()
Пример входных данных (in.txt):
This is line #aabbcc #ddeeff
Суть скрипта в том, чтобы заменить все цвета в файле (предполагается, что это CSS) на те же, но инвертированные.
В коде выше функцию инвертирования цвета я заменил на upper(), что сути не меняет.
Сложность заключается в том, что строка это неизменяемый тип данных и в результате выполнения данного скрипта я вместо:
This is line #AABBCC #DDEEFF
Получаю:
This is line #aabbcc #DDEEFF
Как в этом случае использовать списки или кортежи я придумать не смог.
В строке во входном файле может быть и больше вхождений цветов, поэтому нужна реализация, которая предусматривает произвольное количество цветов в строке.
Функцию re.sub() я использовать не могу, так как тогда получется, что все вхождения в строке заменяются на одинаковые.
Например, если в строке три цвета: #aaaaaa #bbbbbb #cccccc, то в результате будет: #AAAAA #AAAAAA #AAAAAA.