J'ai une chaîne que j'essaie de scinder en morceaux en fonction de lignes vierges.
donné une chaîne cela fonctionne dans certains cas: p> mais cela ne fonctionne pas si la ligne est complètement vide: p> s code>, je pensais pouvoir faire ceci: p> xxx pré> >>> s = 'foo\nbar\n\nbaz'
>>> re.split('(?m)^\s*$', s)
['foo\nbar\n\nbaz']
5 Réponses :
Ce que vous faites mal consiste à utiliser des expressions régulières. Quel est le problème avec ("quelque \ ntext"). Split ('\ n')? P>
Il veut faire correspondre des lignes vierges pouvant avoir des espaces blanche. La fractionnement sur "\ n" se séparera toutes les lignes. Splittong sur "\ n \ n" (qui est probablement ce que vous vouliez dire) ne fonctionnera pas sur des lignes vides avec des espaces sur eux.
Parce que cela ne divise pas l'entrée où il a demandé. Il souhaite séparer des groupes de texte par plusieurs nouvelles lignes. C'est-à-dire que deux lignes contenant du texte, séparées par une seule nouvelle ligne ne sont pas séparées, mais si elles sont séparées par deux lignes (ou probablement plus), avec uniquement des espaces blancheurs sur toutes les lignes vides, doivent être séparées.
Alors ne dis pas "vide" si vous ne voulez pas dire "vide".
Essayez cela à la place:
re.split('\n\s*\n', s)
Cependant, il laisse des lignes vides numérotées au début de leurs morceaux, ce qui pourrait ne pas être souhaitée.
Drôle, comment votre esprit peut rester coincé dans une ornière. J'avais besoin de multilignes pour une autre correspondance, et il semblait donc évident de l'utiliser ici. Voilà pour "évident". Je garderai la réponse de Zac comme accepté parce qu'il a cité ma situation exacte des docs, mais votre réponse est très utile aussi!
J'ai donné une explication et une solution; Il n'a pas fait.
D'Oh! Eh bien, c'est ce que je reçois pour me précipiter pour répondre. Je pense vraiment que votre autre exemple ici est équivalent à votre premier; \ s comprend \ n, après tout. En d'autres termes, je ne pense pas que Eswald a raison. De plus, cette réponse ne "traitera pas" avec la terminaison de nouvelles lignes dans la chaîne à scinder, si cela importe. Mais c'est mieux que mon approche "abandonner et rentrer à la maison".
Oh, tu as raison. D'une manière ou d'une autre "\ s *" est devenue "*" alors que j'étais édité. J'ai corrigé la réponse; cela le simplifie beaucoup.
Est-ce ce que vous voulez?
La bibliothèque Re peut scinder sur une ou plusieurs lignes vides! Une ligne vide est une chaîne qui consiste en zéro ou plus d'espaces blanchisseurs, commence au début de la ligne et se termine à la fin d'une ligne. Le caractère spécial "$" correspond à la fin de la chaîne ou juste avant la nouvelle ligne à la fin de la chaîne, et en mode multiligne correspond également à une nouvelle ligne (extrait de docs ). C'est pourquoi nous devons ajouter un caractère spécial '\ s *' pour la pause de ligne. Tout est possible: -)
>>> import re
>>> text = "foo\r\n \r\n \r\n \r\nbar\r\n"
>>> re.split("(?m)^\s*$\s*", text)
['foo\r\n', 'bar\r\n']
Pour supprimer des ruptures de ligne de fin, vous devez ajouter \ s * code> avant ^ code> comme suit: re.split ("(? M) \ s * ^ \ s * $ \ s * ", texte) code>
essayez ceci: strong>
Est-ce que ces lignes peuvent ou non contenir des caractères d'espaces?
Pouvez-vous montrer des exemples d'entrée et de sortie?
On dirait que cette fonction conçue. De docs.python.org/library/re.html : "Split ne sera jamais divisé une corde sur un match de modèle vide ". Pour une version de travail, reportez-vous à la réponse de Glenn Maynard ('\ n \ s * \ n'), mais notez son avertissement sur la manipulation de plusieurs lignes vides / espaces. Vous pouvez essayer de construire quelque chose autour de Re.Finditer à la place.