使用字典和转义字符时出现奇怪的 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'
我知道我可能会错过一些隐式编码更改,但我仍然想知道发生这种情况的原因?提前致谢!
5c
在 utf-8
中是 \
。
当您尝试将字符串保存为 c
Python returns 时 5c
的 utf-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
我是 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'
我知道我可能会错过一些隐式编码更改,但我仍然想知道发生这种情况的原因?提前致谢!
5c
在 utf-8
中是 \
。
当您尝试将字符串保存为 c
Python returns 时 5c
的 utf-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