2 votes

Échapper les caractères réservés dans une liste en ajoutant une barre oblique inverse devant eux

reserved_chars = "? & | ! { } [ ] ( ) ^ ~ * : \ " ' + -"

list_vals = ['gold-bear@gmail.com', 'P&G@dom.com', 'JACKSON! BOT', 'annoying\name']

Quel est le moyen le plus rapide de parcourir chaque élément d'une liste et d'ajouter un \ devant le caractère réservé si l'un des éléments les contient ?

la sortie souhaitée :

fixed_list = ['gold\-bear@gmail.com', 'P\&G@dom.com', 'JACKSON\! BOT', 'annoying\\name']

7voto

Mark Meyer Points 31911

Vous pouvez créer une table de traduction avec str.maketrans() et le passer dans translate. Cela demande un peu de préparation, mais vous pouvez réutiliser la table de traduction et c'est assez rapide :

reserved_chars = '''?&|!{}[]()^~*:\\"'+-'''
list_vals = ['gold-bear@gmail.com', 'P&G@dom.com', 'JACKSON! BOT', 'annoying\\name']

# make trans table
replace = ['\\' + l for l in reserved_chars]
trans = str.maketrans(dict(zip(reserved_chars, replace)))

# translate with trans table
fixed_list = [s.translate(trans) for s in list_vals]

print("\n".join(fixed_list))

Imprimés :

gold\-bear@gmail.com
P\&G@dom.com
JACKSON\! BOT
annoying\\name

0voto

Patrick Artner Points 29630

Il n'y a pas de moyen rapide - vous avez des chaînes, les chaînes sont immuables, vous devez en créer de nouvelles.

La meilleure solution consiste probablement à créer votre propre dictionnaire de traduction et à effectuer vous-même le travail fastidieux :

reserved = """? & | ! { } [ ] ( ) ^ ~ * : \ " ' + -"""

tr = { c:f"\\{c}" for c in reserved}
print(tr)
data = ['gold-bear@gmail.com', 'P&G@dom.com', 'JACKSON! BOT', 'annoying\name']

transformed = [ ''.join(tr.get(letter,letter) for letter in word) for word in data]

for word in transformed:
    print(word)

Sortie :

# translation dictionary
{'?': '\\?', ' ': '\\ ', '&': '\\&', '|': '\\|', '!': '\\!', '{': '\\{', 
 '}': '\\}', '[': '\\[', ']': '\\]', '(': '\\(', ')': '\\)', '^': '\\^', 
 '~': '\\~', '*': '\\*', ':': '\\:', '\\': '\\\\', '"': '\\"', "'": "\\'", 
 '+': '\\+', '-': '\\-'}

# transformed strings  
gold\-bear@gmail.com
P\&G@dom.com
JACKSON\!\ BOT
annoying
ame

Sidenotes :

  • Votre exemple a manqué d'échapper à l'espace intérieur 'JACKSON\! BOT' .
  • El repl() de la transformed a l'air d'être "mal" échappée parce que, lors de l'impression, elle échappe à chaque '\' encore une fois - ce qui est imprimé voir liste de mots

0voto

Boris Lipschitz Points 1488

Ce n'est certainement pas le plus rapide, mais c'est peut-être le plus facile à coder. Faites une regex qui le fait pour vous, et exécutez re.sub, comme ceci :

import re

reserved_chars = "?&|!{}[]()^~*:\\\"'+-"
replace_regex = "([" + ''.join('\\x%x' % ord(x) for x in reserved_chars) + "])"

list_vals = ['gold-bear@gmail.com', 'P&G@dom.com', 'JACKSON! BOT', r'annoying\name']
escaped_vals = [re.sub(replace_regex, r"\\\1", x) for x in list_vals]

Encore une fois, juste pour clarifier, les regex sont LENTS.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X