-1
votes

Comment rejoindre des chaînes dans Python afin d'obtenir un texte multiligne SO \ N représente une nouvelle ligne et non un personnage?

Compte tenu d'une liste de chaînes: ['string_a', 'string_b', 'string_c'] code>

si je joins ces chaînes avec un \ n code>:





p> p>

Le résultat est (cas 0): 'string_a \ nstring_b \ nstring_c' code> p>

et si j'imprime le résultat (cas 1): p>

string_a
string_b
string_c


20 commentaires

Avez-vous essayé d'l'imprimer? Imprimer ('\ N'.Join ([' string_a ',' string_b ',' string_c ']))


"Cela se produit parce que le \ n est considéré comme un personnage et non une nouvelle ligne." ... \ n est un caractère, couramment rendue comme une nouvelle ligne. Chèque, à la place, les marqueurs de début de ligne et de fin de ligne dans les regexps, ceux qui peuvent aider


Votre chaîne ne peut pas vraiment être rendue comme string_a \ nstring_b \ nstring_c sauf si le `\ \` a été échappé, c'est pourquoi r'string_b \\ n. + ' trouvera là-bas .


@Gphilo ça ne marche pas. J'ai essayé d'utiliser ^ (pour commencer) et $ (pour la fin) et cela ne correspond à aucun.


@mad_ Mais comment puis-je l'imprimer à une variable au lieu de l'imprimer à stdout?


@Gustavomaia ^ string_b \ n. + $ ? Ou voulez-vous toutes les lignes ci-dessous string_b ?


Vous pouvez utiliser une alternative ici: string_b (?: \ N | \\ n). + Voir Forked Regex101


Votre '\ n'.join ([' string_a ',' string_b ',' string_c ']) fait ce que vous demandez dans le titre comme ' \ n ' est A Newline, LF, caractère .


@Kaddath Ça fonctionne bien, mais je reçois un autre problème: le texte réel que je souhaite trouver n'est pas toutes les lignes après string_b , je ne fonctionne pas un motif et cela ne fonctionne pas


@ Wiktorstribiżew mais regex ne le voit pas comme une nouvelle ligne mais comme un caractère de chaîne


Newline est une chaîne. Regex jamais "voit" quoi que ce soit, il correspond à un texte avec un motif ou non, c'est tout. Si vous souhaitez faire correspondre une nouvelle ligne, utilisez une nouvelle ligne, \ n dans la regex. C'est tout ce qu'il y a.


Méfiez-vous que le . dans votre dernier . + signifie n'importe quel caractère, à l'exception des terminateurs de ligne , comme Regex101 stipule, c'est pourquoi vous n'obtenez pas eux, essayez avec [\ s \ s] + à la place


@Kaddath C'est en fait ce que je fais Regex101.com/r/e1rnc6/2


Et puis pourquoi ne pas vous 1) Définir l'option Python et 2) utilisez le Code généré automatiquement ?


@ Wiktorstribiżew parce que cela ne fonctionne pas comme je veux que cela fonctionne. Le deuxième bloc de texte dans la liaison est le texte avec le \ n et le résultat de celui-ci est différent du résultat du premier bloc de texte. Ce dont j'ai besoin, c'est le deuxième bloc d'avoir un résultat identique au premier bloc.


Et quelle est la façon dont vous voulez? Votre question et vos commentaires ne sont pas clairs. Fournir 1) une vraie chaîne littérale ou - meilleur - string littéral que vous souhaitez travailler avec, 2) Expliquez ce que vous devez faire correspondre à cette chaîne


@ Wiktorstribiżew malheureux je ne peux pas fournir la vraie chaîne. Désolé pour la confusion dans le premier lien. Ce dont j'ai besoin, c'est ces deux ( REGEX101.COM/R/fo2ad9/1 , REGEX101.COM/R/GCAVUC/1 ) Pour avoir le même résultat


Quel est le résultat? Quel résultat est correct? Ici - REGEX101.com/R/fo2ad9/1 ou - REGEX101.com/R/gCavuc/1 ici? Nous ne pouvons pas lire vos pensées.


Ceci est le bon Regex101.com/r/fo2ad9/1


Génial, il est clair maintenant. Utilisez r'string: (((?: (?: \ N | \\ n) + \ d + [-.] (?: (?! \\ n).) *) +) " ( Démo et Demo )


3 Réponses :


0
votes

Vous pouvez utiliser un '|' Pour ou donc: xxx

espère que cela aide!


1 commentaires

Je préférerais trouver une méthode pour avoir les deux situations travaillant uniquement avec une regex uniquement. J'ai souvent simplifié la réégalité pour créer la question, de faire un motif pour chacun en ferait beaucoup plus compliqué que je pense.



0
votes

Ne pas utiliser r préfixe pour la chaîne de regex. R dit à la février pour traiter le modèle comme une chaîne brute.

Utilisez 'string_b \ n. +'

sauf si un préfixe "R" ou "R" est présent, des séquences d'échappement dans les chaînes sont interprétés selon des règles similaires à celles utilisées par la norme C. Les séquences d'échappement reconnues sont:

Séquence d'échappement Signification Notes \ Newline ignorée \ Backslash () \ 'Citation unique (') \ "double citation (") \ a
ASCII BLOCH (BEL) \ B ASCII BACKSPACE (BS) \ F ASCII Formfeed (FF) \ N ASCII Linefeed (lf) \ n {nom} caractère nommé Nom dans la base de données Unicode (Unicode uniquement) \ R ASCII Retour (CR) \ T ASCII onglet horizontal (onglet) \ Uxxxx caractère Avec une valeur hexagonale 16 bits xxxx (Unicode uniquement) \ uxxxxxxxxx personnage avec une valeur hexagonale 32 bits xxxxxxxxx (Unicode uniquement) \ V ASCII vertical Onglet (vt) \ ooo caractère avec valeur octale ooo \ xhh caractère avec Valeur hexagonale HH


1 commentaires

Ça ne marche toujours pas. Je pense que le problème est dans la chaîne cible non dans la regex.



-2
votes
l=['a','s','c']

''.join(list(i+'\n' for i in l )))
this is working well

0 commentaires