使用字典和转义字符时出现奇怪的 Python 行为

Weird Python behavior while using Dictionary and escape characters

我是 Python 的新手,我正在尝试按照以前的方式执行简单的任务,但我遇到了一个有趣的...功能?

下面的代码完全符合我的要求:

def cleanLDAP(search):
  escChars = {'(':r'', ')':r'' }
  for ch, val in escChars.items():
    if ch in search:
      search = search.replace(ch, val)
  return search

cleanLDAP('(123)')

如我所料,输出是 '\28123\29',但是当我按如下方式更改 escChars 时:

escChars = {'(':r'', ')':r'', '\': 'c' }

输出变得有点奇怪:'\x05c28123\x05c29'

我知道我可能会错过一些隐式编码更改,但我仍然想知道发生这种情况的原因?提前致谢!

5cutf-8 中是 \

当您尝试将字符串保存为 c Python returns 时 5cutf-8 十六进制,因为您在字符串前添加了 \ 这会导致您的值变为:\x05c.

'c'
#'\x05c'

'5c'
#'5c'

escChars
#{'(': '\28', ')': '\29', '\': '\x05c'}

当您迭代密钥时,它在迭代中测试的 ch\,因为您没有使用 raw 格式字符串 [=24] 保存密钥=].

for ch, value in escChars.items(): 
    print(ch, value)

#( 
#) 
#\ c

最后,由于每次在迭代过程中找到匹配项时您都在修改,因此您正在检查 \ 是否存在 您通过 [= 添加它之后26=]

这会引导您进行第一次替换,然后将您插入字符串中的 \ 替换为 \utf-8 符号。

此处的简单修复是使用 r 保存您的密钥,以确保代码仅匹配 \ 而不是 \,并使用相同的方式保存您的值确保它不会转换为十六进制。

def cleanLDAP(search):
    escChars = {'(':r'', ')':r'', r'\': r'c' }
    for ch, val in escChars.items():
        if ch in search:
            search = search.replace(ch, val)
    return search

>>> cleanLDAP('(123)')

#'\28123\29'

改为-

escChars = {'(':r'', ')':r'', '\': r'c' }

您错过了添加 r'c',只是添加了 'c'。这使其成为十六进制。

举个例子来理解-

a=''
a
ord(a)

Returns分别为'\x05'5