Манипуляции со строками при задании целочисленного параметра Python - PullRequest
0 голосов
/ 02 июня 2018

Я манипулирую файлом SVG.У меня есть эта строка в виде стиля

'.cls-1{fill:#755841;}.cls-2{fill:#f7c394;}.cls-3{fill:#9b7657;}.cls- 
4{fill:#7f6145;}.cls-5{fill:#ffc9a1;}.cls-6{fill:#ffcd98;}.cls- 
7{fill:#3d0c0c;}.cls-8{fill:#fff;}.cls-9{fill:#313cc4;}'

Я хочу создать функцию, которая получает вход, скажем, 14, и изменяет эту строку, начиная с числа, которое продолжается от ввода.Например, здесь занятия начинаются с 14 + 1 = 15 и так далее:

'.cls-15{fill:#755841;}.cls-16{fill:#f7c394;}.cls-17{fill:#9b7657;}.cls- 
18{fill:#7f6145;}.cls-19{fill:#ffc9a1;}.cls-20{fill:#ffcd98;}.cls- 
21{fill:#3d0c0c;}.cls-22{fill:#fff;}.cls-23{fill:#313cc4;}'

Не совсем уверен, что будет лучшим подходом.Это регулярное выражение?

Ответы [ 3 ]

0 голосов
/ 02 июня 2018

вы можете использовать функцию sub из re:

import re
def increment_value_in_string (s, inc_value):
    return re.sub('(?<=\.cls-)\d*',lambda m: str(inc_value+int(m.group(0))),s)

string = '.cls-1{fill:#755841;} ... '
increment_value = 14
new_string = increment_value_in_string(string, increment_value)

, вы ищете любую цифру \d* после подстроки .cls- и заменяете ее с помощью функции lambda m: str(inc_value+int(m.group(0))), где m.group (0) - строка, содержащая найденные цифры

0 голосов
/ 02 июня 2018

Ну, строка на самом деле является кодом CSS.Как насчет анализа его с помощью анализатора Python CSS, а затем прагматического доступа к результирующим объектам?

Использование cssutils : link

import cssutils

css = '.cls-1{fill:#755841;}.cls-2{fill:#f7c394;}.cls-3{fill:#9b7657;}.cls-4{fill:#7f6145;}.cls-5{fill:#ffc9a1;}.cls-6{fill:#ffcd98;}.cls-7{fill:#3d0c0c;}.cls-8{fill:#fff;}.cls-9{fill:#313cc4;}'

sheet = cssutils.parseString(css)

for rule in sheet:
    text = rule.selectorText.split('-')
    name,num = text
    num = int(num)
    num += 10

    rule.selectorText = name + '-' + str(num)        

print sheet.cssText.translate(None, ' \n\t\r')

output:

.cls-11{fill:#755841}.cls-12{fill:#f7c394}.cls-13{fill:#9b7657}.cls-14{fill:#7f6145}.cls-15{fill:#ffc9a1}.cls-16{fill:#ffcd98}.cls-17{fill:#3d0c0c}.cls-18{fill:#fff}.cls-19{fill:#313cc4}
0 голосов
/ 02 июня 2018

Вы можете использовать следующие способы:

Включить доступ к внешней области:

import re

start_point = 5

input_value = """.cls-1{fill:#755841;}.cls-2{fill:#f7c394;}.cls-3{fill:#9b7657;}.cls-4{fill:#7f6145;}.cls-5{fill:#ffc9a1;}.cls-6{fill:#ffcd98;}.cls-7{fill:#3d0c0c;}.cls-8{fill:#fff;}.cls-9{fill:#313cc4;}"""


def callback(match):
    global start_point
    start_point += 1

    return '{key}{value}'.format(
        key=match.group(1),
        value=start_point
    )


result = re.sub('(cls-)([0-9]+)', callback, input_value)

print(result)

Без доступа к внешней области:

import re

from functools import partial

start_point = 5

input_value = """.cls-1{fill:#755841;}.cls-2{fill:#f7c394;}.cls-3{fill:#9b7657;}.cls-4{fill:#7f6145;}.cls-5{fill:#ffc9a1;}.cls-6{fill:#ffcd98;}.cls-7{fill:#3d0c0c;}.cls-8{fill:#fff;}.cls-9{fill:#313cc4;}"""


def callback(point, match):
    point[0] += 1

    return '{key}{value}'.format(
        key=match.group(1),
        value=point[0]
    )


func = partial(callback, [start_point])
result = re.sub('(cls-)([0-9]+)', func, input_value)

print(result)

Результат:

  • Ввод: .cls-1 {fill: # 755841;}. Cls-2 {заполнить: # f7c394;} ЦБС-3 {заполнения: # 9b7657;} ЦБС-4 {заполнения:. # 7f6145;} ЦБС-5 {заполнения:. # ffc9a1;} ЦБС-6 {заполнения:. # ffcd98;}..cls-7 {fill: # 3d0c0c;}. cls-8 {fill: #fff;}. cls-9 {fill: # 313cc4;}
  • Начальная точка: 5
  • Вывод: .cls-6 {fill: # 755841;}. Cls-7 {fill: # f7c394;}. Cls-8 {fill: # 9b7657;}. Cls-9{заполнения: # 7f6145;} CLS-10 {заполнения: # ffc9a1;} CLS-11 {заполнения: # ffcd98;}. CLS-12 {заполнения: # 3d0c0c;}. CLS-13 {заполнения:. #FFF;.} .cls-14 {fill: # 313cc4;}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...