Paul_Smith
@Paul_Smith

Замена цифр на регулярках

Есть файл, в котором куча строк с текстом:

fillColor: 'rgb(R,G,B)'

Где R,G,B — трехзначные цифры

Нужно уменьшить значения каналов G и B (т.е. уменьшить 2 последние цифры в скобках) на одинаковые значения.
Саму подстроку ищу так:

rgb\(([0-9]{1,3}),([0-9]{1,3}),([0-9]{1,3})\)


Как теперь сделать замену, чтобы выводилось rgb(R,G-50,B-50)?
Т.е. чтобы G-50 было не строкой, а именно из числа вычиталось 50 и подставлялось на место G.
  • Вопрос задан
  • 4387 просмотров
Пригласить эксперта
Ответы на вопрос 2
UZER2006
@UZER2006
Независимо от среды выполнения нет возможности средствами самого regexp посчитать всё это дело. Надо получать строку (или части, распознанные регуляркой), считать и формировать готовую строку на выход.
Как вариант, в JS есть метод с callback: String.replace(<expression>,function(value){}). Callback вызывается для каждого совпадения, и само совпадение заменяется значением, которое возвращает функция.
Ответ написан
avalak
@avalak
Набросал вариант для Python.

#!/usr/bin/env python2

import re

with open("source_raw.txt") as f:
    source_raw=f.read()

def repl(m):
    def fix(v, delta=50):
        n = int(v) - delta
        return n if n >= 0 else 0

    return "rgb({r},{g},{b})".format(r=m.group(1), g=fix(m.group(2)), b=fix(m.group(3)))

source=re.sub(r'rgb\((\d{1,3}),(\d{1,3}),(\d{1,3})\)', repl, source_raw)

with open("source.txt", "w") as f:
    f.write(source)

Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы