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é!
3 Réponses :
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?
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.
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))
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.