1
votes

trouver des éléments spécifiques dans la chaîne / liste et les déplacer par incrément

J'essaie de changer le chemin dans un SVG en unités cm en mm. Le chemin est défini par la chaîne "d" et ressemble à ceci:

def cm_to_mm(chars, char, increment):
# Convert character sequence to list type.
char_list = list(chars)
if "." in chars:
    # Get the current index of the target character.
    old_index = char_list.index(char)
    # Remove the target character from the character list.
    char = char_list.pop(old_index)
    # Insert target character at a new location.
    new_index = old_index + increment
    char_list.insert(new_index, char)
    # Convert character list back to str type and return.
return ''.join(char_list)

Je veux maintenant déplacer tous les points décimaux d'un incrément i (pour cm en mm -> i = 1) . Le résultat doit ressembler à:

<path d="M3173.962167,-1427.0 L3173.962167,-1427.0

ou

<path d="M3173.962167,-1427 L3173.962167,-1427

donc si le point décimal est déplacé et que l'entrée de liste suivante est vide, soit le point décimal doit alors être effacé, soit un "0" doit être ajouté. tout ce qui est plus facile. Je suppose que d'abord déplacer tous les points décimaux, puis effacer les points qui sont suivis d'un espace vide dans une deuxième boucle est la meilleure option.

Ce que j'ai jusqu'à présent:

<path d="M317.3962167,-142.7 L317.3962167,-142.7 ...

Mais cela ne déplace que la première occurrence de "."

J'ai déjà vérifié beaucoup de messages, mais la plupart ne parlent que de déplacer un personnage à la fin avec "ajouter" , ce qui n'aide pas dans mon cas. Merci pour votre aide, c'est vraiment apprécié!


0 commentaires

3 Réponses :


0
votes

Ne serait-il pas préférable de créer une liste comme celle-ci?

path_string = "M" + str(new_path_list[0]) + ", " + str(new_path_list[1]) + ", L" + str(new_path_list[0]) + ", " + str(new_path_list[1])

Vous obtiendrez maintenant une liste avec ces nombres déplacés à 1 décimale. Ensuite, vous pouvez créer votre chemin comme ceci

path_list = [ 317.3962167, -142.7]
new_path_list = []

for i in path_list:
    new_path_list.append(i*10)

Cela vous donnerait une chaîne comme si vous en vouliez, n'est-ce pas?


1 commentaires

l'idée n'est pas mauvaise, mais non, cela ne marcherait pas. le nombre de chiffres derrière M&L, etc. n'est pas toujours le même et les nombres de M & L ne le sont pas non plus. De plus, j'ai aussi pensé à extraire les nombres, à les multiplier puis à les réinsérer par string.replace mais le même nombre pourrait être là plusieurs fois. peut créer des erreurs.



0
votes

Essayez ceci,

<path d="M3173.962167,-1427.0 L3173.962167,-1427.0"></path>

Sortie

import re

input = '<path d="M317.3962167,-142.7 L317.3962167,-142.7"></path>'

# extract all the values inside the tag
values = re.search('d="(.*)"', input)

parsed_values = []
for value in values.group(1).split(","):

    tmp = []
    for v in value.split():
        search_ = re.search("([\w|-])(\d+.\d+)", v)

        # 317.3962167 * 10 -> 3173.962167 
        prefix, num = search_.group(1), float(search_.group(2)) * 10
        tmp.append(prefix + str(num))

    parsed_values.append(" ".join(tmp))

print('<path d="%s"></path>' % ",".join(parsed_values))


0 commentaires

2
votes

Vous pouvez utiliser regex. Vous pouvez enregistrer pour gérer les positions des chaînes.

import re

def rpl(mo): 
    v= float(mo[0])*10 
    return str(v) 

s= '<path d="M317.3962167,-142.7 L317.3962167,-142.7" >'

re.sub(r"[-]?\d+[\.]?\d*",rpl,s)  

'<path d="M3173.962167,-1427.0 L3173.962167,-1427.0" >'

Dans re.sub, le r "[-]? \ D + [\.]? \ D *" est le motif du float, rpl est une routine avec un objet match comme argument, m [0] est la première correspondance, c'est-à-dire le float.


0 commentaires