2

こんにちは、Python2.7の次のコードスニペットを見てください。

# -*- coding: utf-8 -*-
content = u"<p>和製英語とかカタカナ英語、&lt;br/>ジャパングリッシュなどと呼ばれる英語っぽいけど実は英語じゃない言葉があります。&lt;/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>和製英語とかカタカナ英語、ジャパングリッシュなどと呼ばれる英語っぽいけど実は英語じゃない言葉があります。&lt;/div>

私の質問は次のとおりです。3つの「置換」ステートメントの間に違いはありますか?(u、r、またはnone?)どちらが最適ですか?

4

2 に答える 2

3

最初のものは最高です。2 番目の 2 つのオプションでは、バイト文字列を暗黙的に Unicode に変換して、Unicode コンテンツ文字列を置換する必要があります。それ以外の場合、提供された文字列を使用すると、結果はたまたま同じになります。置換文字列に非 ASCII 文字が含まれている場合、変換のデフォルト コーデックがasciiPython 2.Xであるため、2 番目の 2 つで UnicodeDecodeError が発生します。

速度の違いにも注意してください。

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-24T22:28:37.180 に答える
0

この場合、これらの文字列は純粋な ASCII であるため、違いはありません。したがって、u" " は r" " および " " と<div>同じです。これは 5 バイトです。<div><div>< d i v >

UTF8 は、ASCII 文字 (0x80 未満) を ... 0x80 未満の同じ ASCII 文字としてコード化します。したがって、ASCII の 'd' はバイト 0x64 でコード化され、その UTF8 コードは再び 0x64 になります。国際文字 (または、00..7F の 16 進数の範囲外の文字) がなくなるまで、違いはありません。

1 つの非 ASCII 文字が使用されるとすぐに違いが現れます。たとえば、イタリア語では、'Pero' は 4 バイトの Pero としてコード化された 4 文字であり、'Però' は 5 バイト (または 6 だったでしょうか?)、Per-0x80-0xF2 などとしてコード化された 4 文字です。

「u」プレフィックスは常に使用する必要があると主張されるかもしれません (私もそうです): 必要がなければ違いはなく、必要であればデータを保存します (UTF8 エンコーディングの背後にある理由は、このタイプの下位互換性を正確に推進するには、http: //en.wikipedia.org/wiki/UTF-8を参照してください)。

于 2012-08-24T22:11:38.193 に答える