我正在使用一个简单的脚本来逃避某些HTML字符,并且遇到的错误似乎是由我的列表-pthread
中的元素顺序引起的。我在循环中不是modifying the lists,所以我想不出我在这里忽略的任何Python /编程原理。
sched_yield
返回
escape_pairs
但是,当我将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;
&
答案 0 :(得分:2)
是的,在您的第一次实施中,它可以。
让我们以>
和列表 -
escape_pairs = [(">", ">"),("<","<"),('"',"""),("&","&")]
在迭代escape_pairs
时,您首先获得>
并将其替换为>
。这会导致字符串变为'>
。然后你继续迭代,最后找到("&","&")
,然后用&
替换字符串中的&
,使结果成为你现在得到的结果。
更改列表的顺序时,会得到正确的结果。但这仍然只是因为你首先考虑了&
,并且在此之后你还考虑了其他因素。
根据字典,您可以使用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("< > &")
'< > &'
答案 1 :(得分:1)
我将在您第一次调用escape_html函数时使用例如:print escape_html(">")
问题:
当你s.replace(i,o)第一次:
s = ">"
s = s.replace(i,o)
">".replace(">", ">")
s = ">"
但是现在当你到达最后一个replace()时,s
的值从那之前就被保存了:
s = ">"
s = s.replace(i,o)
">".replace("&","&") #replaces the "&" in `">"` with `"&"`
s = "&gt;"
为什么订单很重要?
这取决于订单的原因是因为当.replace("&","&")
首先出现时它将是:
s = ">"
s = s.replace(i,o)
">".replace("&","&") #No "&"'s to replace so:
s = ">"
然后您的程序继续按预期工作。
解决方案:
因为您尝试制作的更改始终只有一个在列表中,只要在进行了更改后返回。
def escape_html(s):
for (i,o) in escape_pairs:
s = s.replace(i,o)
return s