Je veux convertir des chaînes contenant des caractères échappées à leur forme normale, de la même manière que le parseur lexical de Python's Python:
>>> escaped_str = 'One \\\'example\\\'' >>> print(escaped_str) One \'Example\' >>> normal_str = normalize_str(escaped_str) >>> print(normal_str) One 'Example'
4 Réponses :
Les backs-backs non appariés ne sont que des artefacts de la représentation et ne sont pas réellement stockés en interne. Vous pouvez causer des erreurs si vous essayez de le faire manuellement.
Si votre seul intérêt est de supprimer une barre oblique inverse non précédée d'une quantité impairée de barres obliques backslashes, vous pouvez essayer une boucle tandis que: P>
escaped_str = 'One \\\'example\\\'' chars = [] i = 0 while i < len(escaped_str): if i == '\\': chars.append(escaped_str[i+1]) i += 2 else: chars.append(escaped_str[i]) i += 1 fixed_str = ''.join(chars) print fixed_str
Ce que l'OP appelle un "analyseur lexical" pourrait être plus précisément appelé un LXER B>, que Python a certainement. Heureusement, nous n'avons pas à le réinventer; Cela se reflète dans certains détails - voir ma réponse.
Je suppose que la question est vraiment:
J'ai une chaîne qui est formatée comme si elle faisait partie du code source Python. Comment puis-je l'interpréter en toute sécurité afin que
\ n code> dans la chaîne soit transformé en une nouvelle ligne, des guillemets sont attendus sur l'une ou l'autre extrémité, etc.? P> blockQuote>
Essayez
ast.literal_eval code>. p>
xxx pré> pour la comparaison, passez dans l'autre sens: P>
>>> print repr(raw_input()) "hi, mom.\n This is a \"weird\" string, isn't it?" '"hi, mom.\\n This is a \\"weird\\" string, isn\'t it?"'
Literal_eval nécessite un littéral de chaîne valide, y compris les citations de début / fin. Ajout des citations (l'échantillon de la question ne les a pas) a plusieurs cas de bord, en fonction du type d'entrée que vous souhaitez accepter.
@Fred très vrai; Mais j'imagine que dans la plupart des situations où il s'agit vraiment du problème que vous souhaitez résoudre, les citations de début / fin sont en fait là, même si Op les laissait sortir de l'exemple. :)
Je ne suis pas sûr que c'est vraiment le problème que vous voudriez toujours résoudre: je suppose que le codec String_escape (comme dans ma réponse) existe pour combler le besoin réel de transformer des évasions sans avoir un littéral à chaîne. (Soulignant littéral_eval est toujours utile cependant; je suis le upvote.;)
Python 3.3a0 (default:b6aafb20e5f5, Jul 29 2011, 05:34:11) [GCC 4.4.3] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> escaped_str = "One \\\'example\\\'" >>> import codecs >>> print(codecs.getdecoder("unicode_escape")(escaped_str)[0]) One 'example'
Un bon tour mérite un autre :) J'ai trouvé une fois que je pouvais résoudre élégamment un problème en écrivant mon propre codec à chaîne, FWIW.
Cette approche ne semble pas fonctionner à Python 3. J'obtiens: AttributeError: "Str 'objet n'a aucun attribut" décodage ".
en Python 3, str code> est
octets code> et
unicode code> est
str code>. Vous devez probablement d'abord d'abord "encoder" dans UTF8 ou ASCII (pour obtenir les octets) puis décoder de "string_escape"
SinglenegationLimination déjà mentionnée cela, mais voici un exemple:
en Python 3: p>
Pour les SSIDS tels que obtenus à partir de IW WLAN0 Scan CODE>, cela m'a donné des erreurs de codage. Résolu avec:
impression (ssid.ençode (). Décode («Unicode_Escape»). Encodé ('' Latin1') .Decode ('utf-8')) code> --- Merci pour la définition Moi sur la bonne voie, attaque!