需要帮助添加转义序列到列表中的所有元素,稍后用于unicode
问题描述:
>>> n
['de', 'db', 'aa', 'dC', 'be', 'Ad', 'Da', 'a7', 'Cb', 'Cc', 'Ed', 'D7', 'CA', 'Da', 'db', 'aa', 'bD', 'db', '7d', 'Ad', 'c4', 'DA', 'Ba', 'bD', 'cc', 'DC', 'da', 'dd', '2d', 'CD', 'bA', 'dA', 'EC', 'Cb', 'dC', 'aC', 'Dd', 'ec', 'CD', 'Ae', 'aC', 'dE', 'BE', 'CE', 'db', 'AC', 'EC', 'cb', 'DE']
我有一个像上面这样的列表。我想在每个元素前添加转义字符'\ x'。我可以做追加为“\ X”但后来我想加入的元素,以创建Unicode字符,如果我用“\ X”,它不工作需要帮助添加转义序列到列表中的所有元素,稍后用于unicode
做请建议
答
可以和应该使用binascii.unhexlify
。的binascii.unhexlify
from binascii import unhexlify
n = ['de', 'db', 'aa', 'dC', 'be', 'Ad', 'Da', 'a7', 'Cb', 'Cc', 'Ed', 'D7',
'CA', 'Da', 'db', 'aa', 'bD', 'db', '7d', 'Ad', 'c4', 'DA', 'Ba', 'bD',
'cc', 'DC', 'da', 'dd', '2d', 'CD', 'bA', 'dA', 'EC', 'Cb', 'dC', 'aC',
'Dd', 'ec', 'CD', 'Ae', 'aC', 'dE', 'BE', 'CE', 'db', 'AC', 'EC', 'cb', 'DE']
print(repr(unhexlify(''.join(n))))
用法示例:unhexlify('abcdef') # '\xab\xcd\xef'
在你的情况,十六进制数字存储在list
,所以你应该串连那些首先使用str.join
。只需将它传递给binascii.unhexlify
即可。
答
你不能在字符串域中轻松地做到这一点。幸运的是,简单的只是用chr
和int
:
>>> n = ['de', 'db', 'aa', 'dC', 'be', 'Ad', 'Da', 'a7', 'Cb', 'Cc', 'Ed', 'D7', 'CA', 'Da', 'db', 'aa', 'bD', 'db', '7d', 'Ad', 'c4', 'DA', 'Ba', 'bD', 'cc', 'DC', 'da', 'dd', '2d', 'CD', 'bA', 'dA', 'EC', 'Cb', 'dC', 'aC', 'Dd', 'ec', 'CD', 'Ae', 'aC', 'dE', 'BE', 'CE', 'db', 'AC', 'EC', 'cb', 'DE']
>>> [chr(int(k, 16)) for k in n]
['Þ', 'Û', 'ª', 'Ü', '¾', '\xad', 'Ú', '§', 'Ë', 'Ì', 'í', '×', 'Ê', 'Ú', 'Û', 'ª', '½', 'Û', '}', '\xad', 'Ä', 'Ú', 'º', '½', 'Ì', 'Ü', 'Ú', 'Ý', '-', 'Í', 'º', 'Ú', 'ì', 'Ë', 'Ü', '¬', 'Ý', 'ì', 'Í', '®', '¬', 'Þ', '¾', 'Î', 'Û', '¬', 'ì', 'Ë', 'Þ']
答
提供给hallazzang的答案一种替代方案:我们可以用literal_eval
安全地打开的unicode字符串表示成Unicode字符。例如,'\\xde'
评估为'Þ'。
>>>from ast import literal_eval
>>>
>>>[ast.literal_eval("'\\x{}'".format(k)) for k in n]
['Þ', 'Û', 'ª', 'Ü', '¾', '\xad', 'Ú', '§', 'Ë', 'Ì', 'í', '×', 'Ê', 'Ú', 'Û', 'ª', '½', 'Û', '}', '\xad', 'Ä', 'Ú', 'º', '½', 'Ì', 'Ü', 'Ú', 'Ý', '-', 'Í', 'º', 'Ú', 'ì', 'Ë', 'Ü', '¬', 'Ý', 'ì', 'Í', '®', '¬', 'Þ', '¾', 'Î', 'Û', '¬', 'ì', 'Ë', 'Þ']
我想指出,literal_eval
是eval
一个安全的替代品。 eval
允许运行任意代码,而literal_eval
只创建字面值,字符串,列表和字符串等文字。
显示所需输出的示例,并通过包含错误消息来解释“不工作”的含义。 – DyZ