我正在尝试用HTML实体替换特殊字符,但结果是随机的,输入相同,我不明白为什么。
以下是代码:
def secure(text):
hsconvert = {"\'": "\\'", "\"": "\\\"", "¢": "¢", "©": "©", "÷": "÷", ">": ">", "<": "<", "µ": "µ", "·": "·", "¶": "¶", "±": "±", "€": "€", "£": "£", "®": "®", "§": "§", "™": "™", "¥": "¥", "á": "á", "Á": "Á", "à": "à", "À": "À", "â": "â", "Â": "Â", "å": "å", "Å": "Å", "ã": "ã", "Ã": "Ã", "ä": "ä", "Ä": "Ä", "æ": "æ", "Æ": "Æ", "ç": "ç", "Ç": "Ç", "é": "é", "É": "É", "è": "è", "È": "È", "ê": "ê", "Ê": "Ê", "ë": "ë", "Ë": "Ë", "í": "í", "Í": "Í", "ì": "ì", "Ì": "Ì", "î": "î", "Î": "Î", "ï": "ï", "Ï": "Ï", "ñ": "ñ", "Ñ": "Ñ", "ó": "ó", "Ó": "Ó", "ò": "ò", "Ò": "Ò", "ô": "ô", "Ô": "Ô", "ø": "ø", "Ø": "Ø", "õ": "õ", "Õ": "Õ", "ö": "ö", "Ö": "Ö", "ß": "ß", "ú": "ú", "Ú": "Ú", "ù": "ù", "Ù": "Ù", "û": "û", "Û": "Û", "ü": "ü", "Ü": "Ü", "ÿ": "ÿ", "\\":"\\\\"};
for i, j in hsconvert.items():
text = text.replace(i, j)
return text
print(secure("La Vie d'Adèle, chapitres 1 & 2"))
以下是控制台输出:
>>> ================================ RESTART ================================
>>>
La Vie d\'Adèle, chapitres 1 & 2
['TV Movie', 'Video Game', 'TV Episode', 'TV Series', 'TV Series ', 'Short', 'TV Mini-Series']
>>> ================================ RESTART ================================
>>>
La Vie d\\'Adèle, chapitres 1 & 2
['TV Movie', 'Video Game', 'TV Episode', 'TV Series', 'TV Series ', 'Short', 'TV Mini-Series']
问题在于'
字符,有时会返回\'
,有时会返回\\'
。
我认为它来自字典中的最后一项,"\\":"\\\\"
,但我不明白为什么每次运行都没有解释它。
答案 0 :(得分:3)
正如您在答案中推测的那样,问题是字典上的迭代没有定义的顺序。
在字典上执行列表(d.keys())会返回所有列表 字典中使用的键,以任意顺序(如果你想要它) 排序后,只需使用sorted(d.keys())代替。
没有明确说明,但同样适用于items()。
在这种情况下看到迭代之间的顺序发生变化我感到有点惊讶,但在这种情况下任意意味着未定义 - 任何订单在技术上都是有效的。如果您想要一致的结果,我建议您重新设计算法,使其对项目的排序不敏感;如果不这样做,首先对输出进行排序或使用OrderedDict,至少可以解决一致性问题。
答案 1 :(得分:0)
我修改了以下功能,它正在运行:
def secure(text):
text.replace("\\", "\\\\")
hsconvert = {"\'": "\\'", "\"": "\\\"", "¢": "¢", "©": "©", "÷": "÷", ">": ">", "<": "<", "µ": "µ", "·": "·", "¶": "¶", "±": "±", "€": "€", "£": "£", "®": "®", "§": "§", "™": "™", "¥": "¥", "á": "á", "Á": "Á", "à": "à", "À": "À", "â": "â", "Â": "Â", "å": "å", "Å": "Å", "ã": "ã", "Ã": "Ã", "ä": "ä", "Ä": "Ä", "æ": "æ", "Æ": "Æ", "ç": "ç", "Ç": "Ç", "é": "é", "É": "É", "è": "è", "È": "È", "ê": "ê", "Ê": "Ê", "ë": "ë", "Ë": "Ë", "í": "í", "Í": "Í", "ì": "ì", "Ì": "Ì", "î": "î", "Î": "Î", "ï": "ï", "Ï": "Ï", "ñ": "ñ", "Ñ": "Ñ", "ó": "ó", "Ó": "Ó", "ò": "ò", "Ò": "Ò", "ô": "ô", "Ô": "Ô", "ø": "ø", "Ø": "Ø", "õ": "õ", "Õ": "Õ", "ö": "ö", "Ö": "Ö", "ß": "ß", "ú": "ú", "Ú": "Ú", "ù": "ù", "Ù": "Ù", "û": "û", "Û": "Û", "ü": "ü", "Ü": "Ü", "ÿ": "ÿ"};
for i, j in hsconvert.items():
text = text.replace(i, j)
return text
但是我不明白为什么旧功能不能正常工作......对于x in ...并不总是相同的顺序?
答案 2 :(得分:0)
有时,您的代码首先用\\
替换\\\\
,然后用\'
替换\\'
。有时它反过来会这样做。
示例(使用“\”作为输入):
如果我们\\
- &gt;先\\\\
,然后\'
- &gt; \\'
我们在第一次尝试替换后获得\'
(因为没有\\
没有任何反应),然后在第二次尝试之后获得\\'
。
但是如果我们反过来这样做,我们会在第一个之后得到\\'
,然后用第\\
替换\\\\
,所以我们最终得到{ {1}}!
这是因为\\\\'
是一个字典,所以它不是有序的,并且迭代它(hsconvert
循环)不一定每次都以相同的方式发生。
你解决它的方式很好,但是为了将来参考,for
模块中有一个OrderedDict
。