大家好,请看一下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>
我的问题是:这三个“替换”语句之间有什么区别吗?(u,r或none?)哪一个是最好的?
发布于 2012-08-25 06:28:37
第一个是最好的。后两个选项必须隐式地将它们的字节字符串转换为Unicode,以便对Unicode内容字符串进行替换。否则,使用所提供的字符串,结果恰好是相同的。如果替换字符串包含非ASCII字符,则后两个字符串上将有一个UnicodeDecodeError,因为在Python2.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
发布于 2012-08-25 06:11:38
在这种情况下,没有区别,因为这些字符串是纯ASCII。所以u"<div>
“和r"<div>
”和"<div>
“是一样的--它是五个字节,<
d
i
v
>
。
UTF8将ASCII字符(低于0x80)编码为...0x80以下的相同ASCII字符。因此,ASCII码中的'd‘是按字节0x64编码的,它的UTF8代码也是0x64。除非没有国际字符(或者更好的是,不在00..7F十六进制范围之外的字符),否则没有区别。
只要使用一个nonASCII字符,这种差异就会显现出来。例如,在意大利语中,'Pero‘是四个字符,编码为四个字节P-e-r-o,而’Peró‘是四个字符,我认为编码为五个字节(或者是六个?)、P-e-r-0x80-0xF2或类似的东西。
有人可能会争辩(我确实是这样认为的),应该始终使用'u‘前缀:如果不需要它,没有区别,如果需要它,它将保存您的数据( UTF8编码背后的理由正是为了促进这种类型的向后兼容性:请参阅http://en.wikipedia.org/wiki/UTF-8 )。
https://stackoverflow.com/questions/12117211
复制相似问题