给定整数参数Python时的字符串操作

时间:2018-06-02 19:02:49

标签: python string svg

我在操纵一个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 :(得分:3)

您可以使用以下方式:

包括对外部范围的访问权限:

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 {fill:#f7c394;}。cls-3 {fill:#9b7657;}。cls-4 {填充:#7f6145;} CLS-5 {填补:#ffc9a1;} CLS-6 {填充:#ffcd98;} CLS-7 {填充:#3d0c0c;} CLS-8 {填补:#FFF;}。 .CLS-9 {填补:#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 {填补:#313cc4;}

答案 1 :(得分:3)

嗯,字符串实际上是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')

输出:

.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}

答案 2 :(得分:2)

您可以使用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)是包含找到的数字的字符串