2

特殊文字を HTML エンティティに置き換えようとしていますが、結果は同じ入力でランダムになり、その理由がわかりません。

コードは次のとおりです。

def secure(text):
    hsconvert = {"\'": "\\'", "\"": "\\\"", "¢": "&cent;", "©": "&copy;", "÷": "&divide;", ">": "&gt;", "<": "&lt;", "µ": "&micro;", "·": "&middot;", "¶": "&para;", "±": "&plusmn;", "€": "&euro;", "£": "&pound;", "®": "&reg;", "§": "&sect;", "™": "&trade;", "¥": "&yen;", "á": "&aacute;", "Á": "&Aacute;", "à": "&agrave;", "À": "&Agrave;", "â": "&acirc;", "Â": "&Acirc;", "å": "&aring;", "Å": "&Aring;", "ã": "&atilde;", "Ã": "&Atilde;", "ä": "&auml;", "Ä": "&Auml;", "æ": "&aelig;", "Æ": "&AElig;", "ç": "&ccedil;", "Ç": "&Ccedil;", "é": "&eacute;", "É": "&Eacute;", "è": "&egrave;", "È": "&Egrave;", "ê": "&ecirc;", "Ê": "&Ecirc;", "ë": "&euml;", "Ë": "&Euml;", "í": "&iacute;", "Í": "&Iacute;", "ì": "&igrave;", "Ì": "&Igrave;", "î": "&icirc;", "Î": "&Icirc;", "ï": "&iuml;", "Ï": "&Iuml;", "ñ": "&ntilde;", "Ñ": "&Ntilde;", "ó": "&oacute;", "Ó": "&Oacute;", "ò": "&ograve;", "Ò": "&Ograve;", "ô": "&ocirc;", "Ô": "&Ocirc;", "ø": "&oslash;", "Ø": "&Oslash;", "õ": "&otilde;", "Õ": "&Otilde;", "ö": "&ouml;", "Ö": "&Ouml;", "ß": "&szlig;", "ú": "&uacute;", "Ú": "&Uacute;", "ù": "&ugrave;", "Ù": "&Ugrave;", "û": "&ucirc;", "Û": "&Ucirc;", "ü": "&uuml;", "Ü": "&Uuml;", "ÿ": "&yuml;", "\\":"\\\\"};
    for i, j in hsconvert.items():
        text = text.replace(i, j)
        return text

print(secure("La Vie d'Adèle, chapitres 1 & 2"))

コンソール出力は次のとおりです。

>>> ================================ RESTART ================================
>>> 
La Vie d\'Ad&egrave;le, chapitres 1 & 2
['TV Movie', 'Video Game', 'TV Episode', 'TV Series', 'TV Series ', 'Short', 'TV Mini-Series']
>>> ================================ RESTART ================================
>>> 
La Vie d\\'Ad&egrave;le, chapitres 1 & 2
['TV Movie', 'Video Game', 'TV Episode', 'TV Series', 'TV Series ', 'Short', 'TV Mini-Series']

問題は、として返されることもあれば として'返されることもある文字にあります。\'\\'

辞書の最後の項目から来ていると思いますが、"\\":"\\\\"実行ごとに同じように解釈されない理由がわかりません。

4

3 に答える 3

3

あなたの答えで推測したように、問題は辞書の反復に定義された順序がないことです。

Python 3 ドキュメントから:

辞書で list(d.keys()) を実行すると、辞書で使用されているすべてのキーのリストが任意の順序で返されます (並べ替えたい場合は、代わりに sorted(d.keys()) を使用してください)。

明示されていませんが、同じことが items() にも当てはまります。

この場合、反復間で順序が変わることに少し驚いていますが、この場合の任意とは未定義を意味し、技術的にはどのような順序でも有効です。一貫した結果が必要な場合は、アイテムの順序にまったく影響されないようにアルゴリズムを再設計することをお勧めします。それができない場合は、最初に出力を並べ替えるか、OrderedDict を使用すると、少なくとも一貫性の問題が解決されます。

于 2013-11-03T19:53:40.243 に答える
0

場合によっては、コードが最初に置き換え\\られ、\\\\次に. 時々、それは逆になります。\'\\'

例 (「\'」を入力として使用):

\\->最初に\\\\、次に\'->最初に試行された置換の後 ( がないため何も起こらない)\\'を取得し、次に2 番目の後に取得します。\'\\\\'

しかし、逆にすると、最初の後に取得し、2 番目のを\\'に置き換えるため、 !になります。\\\\\\\\\\'

これhsconvertは、 が辞書であるため順序付けられておらず、反復 (forループ) が毎回同じ方法で行われるとは限りません。

あなたがそれを解決するために行った方法は問題ありませんが、将来の参考のためOrderedDictに、collectionsモジュールに があります。

于 2013-11-03T19:51:37.510 に答える
0

関数を次のように変更しましたが、機能しています:

def secure(text):
    text.replace("\\", "\\\\")
    hsconvert = {"\'": "\\'", "\"": "\\\"", "¢": "&cent;", "©": "&copy;", "÷": "&divide;", ">": "&gt;", "<": "&lt;", "µ": "&micro;", "·": "&middot;", "¶": "&para;", "±": "&plusmn;", "€": "&euro;", "£": "&pound;", "®": "&reg;", "§": "&sect;", "™": "&trade;", "¥": "&yen;", "á": "&aacute;", "Á": "&Aacute;", "à": "&agrave;", "À": "&Agrave;", "â": "&acirc;", "Â": "&Acirc;", "å": "&aring;", "Å": "&Aring;", "ã": "&atilde;", "Ã": "&Atilde;", "ä": "&auml;", "Ä": "&Auml;", "æ": "&aelig;", "Æ": "&AElig;", "ç": "&ccedil;", "Ç": "&Ccedil;", "é": "&eacute;", "É": "&Eacute;", "è": "&egrave;", "È": "&Egrave;", "ê": "&ecirc;", "Ê": "&Ecirc;", "ë": "&euml;", "Ë": "&Euml;", "í": "&iacute;", "Í": "&Iacute;", "ì": "&igrave;", "Ì": "&Igrave;", "î": "&icirc;", "Î": "&Icirc;", "ï": "&iuml;", "Ï": "&Iuml;", "ñ": "&ntilde;", "Ñ": "&Ntilde;", "ó": "&oacute;", "Ó": "&Oacute;", "ò": "&ograve;", "Ò": "&Ograve;", "ô": "&ocirc;", "Ô": "&Ocirc;", "ø": "&oslash;", "Ø": "&Oslash;", "õ": "&otilde;", "Õ": "&Otilde;", "ö": "&ouml;", "Ö": "&Ouml;", "ß": "&szlig;", "ú": "&uacute;", "Ú": "&Uacute;", "ù": "&ugrave;", "Ù": "&Ugrave;", "û": "&ucirc;", "Û": "&Ucirc;", "ü": "&uuml;", "Ü": "&Uuml;", "ÿ": "&yuml;"};
    for i, j in hsconvert.items():
        text = text.replace(i, j)
    return text

しかし、古い関数が機能しない理由がわかりません... A for x in ... は常に同じ順序ではありませんか?

于 2013-11-03T19:45:43.177 に答える