我正在使用一个简单的脚本来逃避某些HTML字符,并且遇到了一个错误,这个错误似乎是由我的列表escape_pairs中的元素顺序引起的.我在循环中不是modifying the lists,所以我想不出任何我在这里忽略的Python /编程原理.
escape_pairs = [(">",">"),("<","<"),('"',"""),("&","&")]
def escape_html(s):
for (i,o) in escape_pairs:
s = s.replace(i,o)
return s
print escape_html(">")
print escape_html("<")
print escape_html('"')
print escape_html("&")
回报
&gt;
&lt;
&quot;
&
但是当我在escape_pairs列表中切换元素的顺序时,bug就消失了
>>> escape_pairsMod = [("&","&"),(">",">")]
>
<
"
&
最佳答案
是的,在您的第一次实施中,它可以.
让我们看一下>和清单 –
escape_pairs = [(">","&")]
在遍历escape_pairs时,首先得到>并用& gt;替换它.这导致字符串变为’& gt; .然后你继续迭代,最后你找到(“&”,“& amp;”),然后你替换&在带有& amp;的字符串中,使结果成为你现在得到的结果.
更改列表的顺序时,您将获得正确的结果.但这仍然只是因为你首先考虑到&只有在那之后你还考虑了其他.
根据字典,您可以使用str.translate来共同翻译字符串.示例 –
>>> escape_pairs = [(">","&")]
>>> escape_dict = dict(escape_pairs)
>>> t = str.maketrans(escape_dict)
>>> ">".translate(t)
'>'
>>> "> & <".translate(t)
'> & <'
但是,如果您想要做的是HTML转义字符串,那么您应该使用标准库 – cgi
–
>>> import cgi
>>> cgi.escape("< > &")
'< > &'
此外,如果您使用的是Python 3.2,则可以使用html.escape
,例如 –
>>> import html
>>> html.escape("< > &")
'< > &'