Python 通过在列表前面添加反斜杠来转义列表中的保留字符

Python 通过在列表前面添加反斜杠来转义列表中的保留字符,python,regex,string,list,Python,Regex,String,List,在列表中的每个元素中循环并在保留字符前面添加\(如果其中一个元素包含它们)的最快方法是什么 期望输出: reserved_chars = "? & | ! { } [ ] ( ) ^ ~ * : \ " ' + -" list_vals = ['gold-bear@gmail.com', 'P&G@dom.com', 'JACKSON! BOT', 'annoying\name'] 您可以使用str.maketrans()创建一个翻译表,并将其传递到translate中。这需

在列表中的每个元素中循环并在保留字符前面添加\(如果其中一个元素包含它们)的最快方法是什么

期望输出:

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

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

您可以使用
str.maketrans()
创建一个翻译表,并将其传递到translate中。这需要一点设置,但您可以重用翻译表,而且速度非常快:

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

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))

没有快速的方法-你有字符串,字符串是不可变的,你需要创建新的

也许最好的方法是建立自己的翻译词典,自己动手做繁重的工作:

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

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)

旁注:

  • 您的示例未能逃出
    'JACKSON\中的空间!BOT'
  • 转换的
    列表的
    repl()
    看起来是“错误”转义的,因为在打印时,它会再次转义每个
    '\'
    本身-正在打印的内容请参见wordlist

    • 肯定不是最快的,但可能是最容易编码的。制作一个为您执行此操作的正则表达式,然后运行re.sub,如下所示:

      # translation dictionary
      {'?': '\\?', ' ': '\\ ', '&': '\\&', '|': '\\|', '!': '\\!', '{': '\\{', 
       '}': '\\}', '[': '\\[', ']': '\\]', '(': '\\(', ')': '\\)', '^': '\\^', 
       '~': '\\~', '*': '\\*', ':': '\\:', '\\': '\\\\', '"': '\\"', "'": "\\'", 
       '+': '\\+', '-': '\\-'}
      
      # transformed strings  
      gold\-bear@gmail.com
      P\&G@dom.com
      JACKSON\!\ BOT
      annoying
      ame
      

      再次澄清一下,正则表达式的速度很慢。

      这不是有效的python-您需要至少转义字符串中的
      ”才能实现这一点-或者使用“”和“”前后划界字符串。不知道maketrans也适用于1到多个转换-很好one@PatrickArtner-是的,这不明显,但你可以传递一个dict来替换多个字符。嗨,你很接近,最后的输出必须是一个列表,最后一个元素有“恼人的\名称”,其中有一个反斜杠it@TH14在回答中,
      fixed_list
      是一个列表。如果你看你的问题,你想要的输出有“恼人的\\name”,因为反斜杠必须转义(除非你想在那里有一个新行
      \n
      。是的,想要的输出应该有“恼人的\\name”,但在你的列表中是“恼人的\\name”,我得到这个输出,[黄金]\\-bear@gmail.com“,”P\\&G@dom.com“,”JACKSON\\!BOT“,”恼人的\\\\name'],在保留的战车前面应该只有一个反斜杠,您的输出将再次转义反斜杠。使用以下内容进行打印:
      对于转义值中的x:Print(x)
      我正在将元素添加到另一个列表中,而不仅仅是打印它们。您正在某个点直接打印它,或者使用str()等将其转换为字符串。这将跳过反斜杠。上面的re.sub没有添加额外的反斜杠。我刚刚运行它,并使用
      print(','.join(转义值))打印输出
      ,获得
      金牌\-bear@gmail.com,P\&G@dom.com,JACKSON\!BOT,恼人的\\name
      输出。通过简单的
      打印(转义值)
      我确实得到了
      ['gold\\-bear@gmail.com“,”P\\&G@dom.com“,”JACKSON\\!BOT“,”恼人的\\\\name']
      ,我几乎100%肯定你最终也会做类似的事情。
      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]