9
votes

Correspondance de lignes vierges avec des expressions régulières

J'ai une chaîne que j'essaie de scinder en morceaux en fonction de lignes vierges.

donné une chaîne s code>, je pensais pouvoir faire ceci: p> xxx pré>

cela fonctionne dans certains cas: p> xxx pré>

mais cela ne fonctionne pas si la ligne est complètement vide: p>

>>> s = 'foo\nbar\n\nbaz'
>>> re.split('(?m)^\s*$', s)
['foo\nbar\n\nbaz']


3 commentaires

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.


5 Réponses :


-2
votes

Ce que vous faites mal consiste à utiliser des expressions régulières. Quel est le problème avec ("quelque \ ntext"). Split ('\ n')?


3 commentaires

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".



17
votes

Essayez cela à la place:

re.split('\n\s*\n', s)


5 commentaires

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.



0
votes

Est-ce ce que vous voulez? XXX


0 commentaires

3
votes

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']


1 commentaires

Pour supprimer des ruptures de ligne de fin, vous devez ajouter \ s * avant ^ comme suit: re.split ("(? M) \ s * ^ \ s * $ \ s * ", texte)



0
votes

essayez ceci: xxx


0 commentaires