HI看一下Python 2.7上的以下代码片段:
# -*- coding: utf-8 -*-
content = u"<p>和製英語とかカタカナ英語、<br/>ジャパングリッシュなどと呼ばれる英語っぽいけど実は英語じゃない言葉があります。</p>"
#print content
print content.replace(u"<p>",u"<div>").replace(u"</p>",u"</div>").replace(u"<br/>",u"")
print content.replace("<p>","<div>").replace("</p>","</div>").replace("<br/>","")
print content.replace(r"<p>",r"<div>").replace(r"</p>",r"</div>").replace(r"<br/>",r"")
结果是一样的:
<div>和製英語とかカタカナ英語、ジャパングリッシュなどと呼ばれる英語っぽいけど実は英語じゃない言葉があります。</div>
我的问题是:三个“替换”声明之间有什么区别吗? (你,或者没有?)哪一个最好?
答案 0 :(得分:3)
第一个是最好的。后两个选项必须隐式地将其字节字符串转换为Unicode以在Unicode内容字符串上进行替换。否则,使用提供的字符串,结果恰好相同。如果替换字符串包含非ASCII字符,则后两个字符串上会出现UnicodeDecodeError,因为转换的默认编解码器是Python 2.X上的ascii
。
注意速度差异:
C:\>python -m timeit -s "content=u'<p>blah<br/>blah</p>'" "content.replace(u'<p>',u'<div>').replace(u'</p>',u'</div>').replace(u'<br/>',u'')"
1000000 loops, best of 3: 1.09 usec per loop
C:\>python -m timeit -s "content=u'<p>blah<br/>blah</p>'" "content.replace('<p>','<div>').replace('</p>','</div>').replace('<br/>','')"
1000000 loops, best of 3: 1.76 usec per loop
C:\>python -m timeit -s "content=u'<p>blah<br/>blah</p>'" "content.replace(r'<p>',r'<div>').replace(r'</p>',r'</div>').replace(r'<br/>',r'')"
1000000 loops, best of 3: 1.75 usec per loop
答案 1 :(得分:0)
在这种情况下,没有区别,因为这些字符串是纯ASCII。因此,“<div>
”与r“<div>
”和“<div>
”相同 - 它是五个字节,<
d
{{1 }} i
v
。
UTF8将ASCII字符(低于0x80)编码为... 0x80以下的相同ASCII字符。因此,ASCII中的'd'由字节0x64编码,其UTF8代码再次为0x64。直到没有国际字符(或更好,00..7F十六进制范围之外的字符),没有区别。
只要使用一个nonASCII字符,就会出现差异。例如意大利语'Pero'是四个字符,编码为四个字节Pero,'Però'是四个字符编码,我认为,五个字节(或者它是六个?),Per-0x80-0xF2或类似的东西。
可能有人认为(并且我确实)应该始终使用'u'前缀:如果不需要它就没有区别,如果需要,它将保存您的数据(背后的原因) UTF8编码用于提升这种向后兼容性:请参阅http://en.wikipedia.org/wiki/UTF-8)。