conversion string en raw string
Réponses:
12
Visites:
0
Up one level
Vous devez être un membre enregistré pour contribuer sur ce forum.
Inscrivez-vous maintenant
conversion string en raw string
Posté par
clousot
le
29/01/2010 12:01
bonjour,
J'ai une chaine de catactères qui contient toujours 2 caractères \ mais dont le caractère qui suit \ peut être n'importe quel charactère alphanumérique. Mon soucis est que je dois faire un split avec \ comme séparateur. Par exemple j'ai chaine = '123\7\456' mais dont je ne connais pas le contenu qui peut être variable... je suis visiblement obligé de convertir cette chaine en 'raw string' au préalable pour considérer \ comme n'importe quel caractère mais je n'y arrive pas. Par exemple chaine_raw = r'%s' % chaine me donne : 123.. au lieu de '123\7\456' en final avec ou sans raw string je dois arriver transformer ma chaine en liste['123','7','456'] ... voyez vous une solution possible ? Merci clousot |
Re: conversion string en raw string
Posté par
jacko
le
29/01/2010 14:22
Quel est votre problème :
code: > a=r"123\7\456"
cela marche très bien. |
Re: conversion string en raw string
Posté par
clousot
le
29/01/2010 15:13
Mon problème est que je ne connais pas le contenu de la chaine donc je ne peux pas ecrire "en dure" :
a = r"123\7\456" sinon en effet mon problème serait simple j'ai la variable a qui m'est imposée, donnée avec un contenu que je ne choisis pas et que je ne connais donc pas au moment du traitement. La seule chose que je sache de a est qu'elle contient obligatoirement 2 caratères '\' Donc la solution en question ne marche pas pour mon cas...merci d'avoir regardé néanmoins |
Re: conversion string en raw string
Posté par
jacko
le
29/01/2010 17:05
Bonjour,
Je me doute bien que votre chaîne se trouve dans une variable affectée d'une façon ou d'une autre en amont ; mon exemple n'était qu'un exemple ! Si toto est la variable contenant votre chaîne, qu'obtenez-vous en faisant : toto.split("\\" ) ? Dites-nous aussi ce que vous obtenez en faisant : print toto et aussi len(toto) Par ailleurs, sachez que string et "raw string" ne sont pas deux types de chaînes. "raw string" est simplement une facilité d'écriture lorsque l'on entre une chaîne explicitement (ce qui n'est pas votre cas justement). Ne cherchez donc pas à "convertir" votre string en "raw string", cela ne veut rien dire. Lorsque vous écrivez : chaine_raw = r'%s' % chaine le "r" s'applique à la chaîne '%s' ; celle-ci ne contenant pas de \ ni autre caractère spécial, le "r" n'a simplement aucun effet. |
Re: conversion string en raw string
Posté par
clic
le
31/01/2010 00:19
Salut !
L'incompréhension vient peut-être du fait que la fonction raw_input() formate correctement les anti-slashs en ajoutant un second anti-slash devant le premier (si on entre '\', la valeur sauvegardée est '\\'). Donc, dans le cas où clousot écrit la chaine de caractères lui même, sans échapper le caractère \, il est normal de ne pas le trouver en faisant un split. Par exemple: # Ne marche pas >>> maChaine = '00\00' >>> resultat = maChaine.split('\\') >>>['00\x00'] # Marche très bien comme le dit jacko >>> maChaine = '00\\00' >>> resultat = maChaine.split('\\') >>>['00', '00'] |
Re: conversion string en raw string
Posté par
clousot
le
02/02/2010 18:02
Bonjour et merci à vous deux,
Par exemple j'avais toto = '123\7\456' => pour répondre à jacko >>> toto.split('\\') ['123\x07.'] >>> print toto 123. >>> len(toto) 5 Bien sure si je fait toto = '123\\7\\456' >>> toto.split('\\') ['123', '7', '456'] >>> print toto 123\7\456 >>> len(toto) 9 Mais celà veut dire qu'il faut que j'arrive à convaincre le client qui m'envoie '123\7\456' de doubler ses backslah si il en a lui même la maîtrise... Merci pour l'aide Clousot |
Re: conversion string en raw string
Posté par
jacko
le
02/02/2010 18:45
Je ne connais rien à votre système, mais en principe ce n'est pas à l'application de demander au client de lui envoyer les données sous une forme spécifique au langage de programmation.
Comment votre client vous envoie-t-il la chaîne de caractères '123\7\456' à traiter ? Comment l'entrez-vous dans votre programme ? Par exemple, est-ce qu'il vous envoie un fichier texte avec la chaîne en question sur une ligne ? Lisez-vous ce fichier par open()/readline() ? |
Re: conversion string en raw string
Posté par
clousot
le
03/02/2010 10:05
Oui tout à fait.
Je lis un fichier texte où se trouve la chaine: try: f=open(DATA_PATH,"r" except: print "ERROR: The file %s can not be opened" % DATA_PATH return -1 file_content = f.read() Je vais chercher du côté du parse de file_content pour voir si j'aurais moyen de ne pas interpréter le caractère \ Merci Clousot |
Re: conversion string en raw string
Posté par
jacko
le
03/02/2010 13:35
Soit un fichier toto.txt contenant les 9 caractères suivants (plus le retour à la ligne) :
123\7\456 code: >>> f=open('toto.txt')
On ne voit toujours pas où est votre problème ! |
Re: conversion string en raw string
Posté par
clousot
le
03/02/2010 14:39
Je fait un parse sur le fichier qui contient une grammaire assez complexe dont l'un des champs est par exemple.
CONDITION "([123\7\456] = 'value1' OR[\45\Input2] > 'value2') AND[12\\Input3] < 'value3'" j'en récupère "([123\7\456] = 'value1' OR[\45\Input2] > 'value2') AND[12\\Input3] < 'value3'" que je dois traiter par morceaux. J'ai finalement réussi au moyen du split( "\\" ) à bien décomposer mes chaines entre[] . Ce qui curieusement posait problème dans mon premier post. Merci |
Re: conversion string en raw string
Posté par
fapae
le
10/02/2010 19:57
Pas tout à fait d'accord.
Lorsqu'on fournit un simple caractère antislash à la fonction raw_input(), elle retourne une chaine qui contient le simple caractère antislash. Idem si on lit un fichier qui contient ce simple caractère. Idem si on construit la chaine à partir du code ASCII du caractère antislash >>> s = chr(92) >>> print s Cela affiche le simple caractère / La confusion vient du fait que si on demande simplement >>> s alors on lit '\\'. Mais il ne faut pas croire que la chaine contient deux caractères. Ici python affiche ce qu'il faudrait lui donner pour construire une chaine contenant UN SEUL caractère antislash. Lorsqu'on écrit >>> maChaine = 'AB\\C\\DE' on construit une chaine contenant 7 caractères A B \ C \ D E On construirait EXACTEMENT la même chaine en écrivant >>> maChaine = r'AB\C\DE' ou en lisant un fichier contenant les 7 caractères. Il n'y a pas en mémoire de chaine "raw" ou pas raw. >>> type(maChaine) donne toujours <type 'str'>. (En revanche u'123' construit bien un autre type de chaine !) Pour splitter au niveau des deux UNIQUES antislash, il suffit d'appeler >>> maChaine.split(chr(92)) Au lieu de chr(92), on peut écrire '\\'. C'est, on l'a dit une chaine contenant un unique antislash. Il peut être tentant de donner r'\' mais c'est interdit. Pas de nombre impair de \ en fin de construction r'...' C'est une règle. Python a décidé de permettre r'\'' pour construire une chaine de deux caractères, antislach puis apostrophe, et donc il attend l'apostrophe de fermeture lorsqu'on donne simplement r'\'. Peut être pas très logique, tant pis. La chaine écrite dans un script '00\00' contient trois caractères, aucun antislash. Deux zéros puis la lettre de code ASCII valant 00 en octal. Python aurait préféré qu'on lui écrive '00\x00' : les deux lettre 0 puis la lettre de code ASCII 00 en hexadécimal. |
Re: conversion string en raw string
Posté par
fapae
le
10/02/2010 19:58
Pas tout à fait d'accord.
Lorsqu'on fournit un simple caractère antislash à la fonction raw_input(), elle retourne une chaine qui contient le simple caractère antislash. Idem si on lit un fichier qui contient ce simple caractère. Idem si on construit la chaine à partir du code ASCII du caractère antislash >>> s = chr(92) >>> print s Cela affiche le simple caractère / La confusion vient du fait que si on demande simplement >>> s alors on lit '\\'. Mais il ne faut pas croire que la chaine contient deux caractères. Ici python affiche ce qu'il faudrait lui donner pour construire une chaine contenant UN SEUL caractère antislash. Lorsqu'on écrit >>> maChaine = 'AB\\C\\DE' on construit une chaine contenant 7 caractères A B \ C \ D E On construirait EXACTEMENT la même chaine en écrivant >>> maChaine = r'AB\C\DE' ou en lisant un fichier contenant les 7 caractères. Il n'y a pas en mémoire de chaine "raw" ou pas raw. >>> type(maChaine) donne toujours <type 'str'>. (En revanche u'123' construit bien un autre type de chaine !) Pour splitter au niveau des deux UNIQUES antislash, il suffit d'appeler >>> maChaine.split(chr(92)) Au lieu de chr(92), on peut écrire '\\'. C'est, on l'a dit une chaine contenant un unique antislash. Il peut être tentant de donner r'\' mais c'est interdit. Pas de nombre impair de \ en fin de construction r'...' C'est une règle. Python a décidé de permettre r'\'' pour construire une chaine de deux caractères, antislach puis apostrophe, et donc il attend l'apostrophe de fermeture lorsqu'on donne simplement r'\'. Peut être pas très logique, tant pis. La chaine écrite dans un script '00\00' contient trois caractères, aucun antislash. Deux zéros puis la lettre de code ASCII valant 00 en octal. Python aurait préféré qu'on lui écrive '00\x00' : les deux lettre 0 puis la lettre de code ASCII 00 en hexadécimal. |
Re: conversion string en raw string
Posté par
e-vidence
le
11/02/2010 15:09
Bonjour,
Il est probable que vous n'ayez rien à faire. De nombreux tutos sur le Net répendent une confusion sur les "raw strings", d'où votre question bien naturelle. La vérité est bien plus simple : les "raw strings" n'existent pas. Qu'est-ce que veut dire le "r" alors ? C'est très simple. "[1, 2, 3]" est une notation qui demande à Python de construire une liste, mais bien sûr, pas ce qui est contenu en RAM. Pour la chaîne, c'est pareil. La chaîne écrite dans le code n'est pas la chaîne en mémoire mais une instruction sur comment python doit construire la chaîne : code: s = "Ma chaîne suivie d'un saut de ligne\n"Ici Python interprète à l'INITIALISATION de l'objet "string" le "\n" comme un saut de ligne. "\n" n'est pas sauvegardé en mémoire, mais bien le caractère "saut de ligne" (qui dépend de votre système d'exploitation). code: s = r"Ma chaîne suivie d'un saut de ligne\n"Ici, on dit à Python de ne rien faire en construisant la chaine et de bêtement recopier caractère par caractère. Le symbole "r" ne change rien au type ou à la manière de stocker la chaîne. Dans votre cas, si la chaîne arrive dans votre programme déjà initialisée (par le biais de raw_input, une requête Web ou un champ de formulaire d'un fenêtre), vous n'avez pas à vous soucier des caractères spéciaux. La chaîne ne changera pas (c'est un type immutable), ne sera pas réinterprétée, elle vous sera donnée telle qu'elle a été entrée. Et un "\n" sera "le caractère '\' suivi de 'n'", tandis que le saut de ligne sera 'le caractère saut de ligne' (suivant votre système d'exploitation). En résumé, ne confondez pas : - la chaîne écrite dans le code (qui contient des notations pour dire comment Python doit créer la chaîne, et non la chaîne elle même); - la chaîne en mémoire (ce avec quoi vous travaillez vraiment); - la chaîne entrée par l'utilisateur (qui peut avoir un encodage différent); - la chaîne qu'affiche l'interpréteur Python. L'interpréteur peut afficher un saut de ligne '\n' et "\n" comme '\\n', or celà porte à confusion. Il vous montre en fait une notation qui n'est qu'une indication, pas ce qui est contenu en mémoire (pas plus qu'un dictionnaire n'est une paire de {} en RAM, mais c'est pourtant créé et surtout affiché ainsi) Ayant fait cette erreur moi-même, je comprends la confusion. Bonne chance. |




