如何解决使用字典和转义符时奇怪的Python行为
我是Python的新手,我正在尝试以以前的方式执行简单的任务,但是我遇到了一个有趣的...功能?
下面的代码正是我想要的:
def cleanLDAP(search):
escChars = {'(':r'\28',')':r'\29' }
for ch,val in escChars.items():
if ch in search:
search = search.replace(ch,val)
return search
cleanLDAP('(123)')
输出是我期望的'\\28123\\29'
,但是当我如下更改escChars
时:
escChars = {'(':r'\28',')':r'\29','\\': '\5c' }
输出变得有点奇怪:'\x05c28123\x05c29'
我知道我可能会错过一些隐式的编码更改,但是我仍然想知道为什么会发生这种情况?预先谢谢你!
解决方法
5c
中的 utf-8
是\
。
当您尝试将字符串另存为\5c
时,Python返回utf-8
的{{1}}十六进制,因为您为字符串加上了5c
前缀,这会使您的值变成:{{ 1}}。
\
当您遍历密钥时,在迭代中要测试的\x05c
是'\5c'
#'\x05c'
'5c'
#'5c'
escChars
#{'(': '\\28',')': '\\29','\\': '\x05c'}
,因为您没有使用ch
格式字符串\
保存密钥
raw
最后,由于您每次在迭代过程中找到匹配项时都在进行修改,因此您要检查r
是否存在,在之后通过for ch,value in escChars.items():
print(ch,value)
#( \28
#) \29
#\ c
添加>
这将导致您先进行替换,然后将插入字符串中的\
替换为replace()
的{{1}}符号。
这里的简单解决方法是用\
保存密钥,以确保代码仅与utf-8
而不是\
匹配,并用相同的值保存值以确保代码不会转换为十六进制。
r
,
更改为-
escChars = {'(':r'\28',')':r'\29','\\': r'\5c' }
您错过了添加r'\5c'
的工作,而刚做了'\5c'
。使其为十六进制。
通过示例进行理解-
a='\5'
a
ord(a)
分别返回'\x05'
和5
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。