7
votes

Quelle est la manière la plus pythonique de normaliser les lignes de normalisation dans une chaîne?

Étant donné une chaîne textuelle de source inconnue, comment la réécrit est-elle une meilleure réécriture d'avoir une londue connue-convention?

i habituellement: p> xxx pré> .. . Mais cela ne gère pas les fichiers texte "mixtes" de conventions totalement confuses (oui, ils existent toujours!). P>

Modifier H2>

L'Onliner de ce que je fais bien sûr: p> xxx pré>

... ce n'est pas ce que je demande. p>

Le nombre total de lignes doit être la même après, donc non Stripping de lignes vides. p>

TESTCASES H2>

STÉDITION P>

'a\nb\n\nc\nd'
'a\r\nb\r\n\r\nc\r\nd'
'a\rb\r\rc\rd'
'a\rb\n\rc\rd'
'a\rb\r\nc\nd'
'a\nb\r\nc\rd'


0 commentaires

3 Réponses :


7
votes

... Mais cela ne traite pas de fichiers texte «mixtes» de conventions totalement confuses (oui, ils existent toujours!)

En réalité, il devrait fonctionner correctement: xxx

Quelle version de python utilisez-vous?

EDIT: I Ne vois pas comment splitlines () ne fonctionne pas pour vous: xxx

aussi loin que je connais splitlines () Ne divise pas la liste deux fois ou quoi que ce soit.

Pouvez-vous coller un échantillon du type d'entrée qui vous donne des problèmes?


3 commentaires

J'ai édité ma question. Cette (convention mixte) a brisé un cas d'essai aujourd'hui :) Ah, les hypothèses que nous faisons ... J'espère éviter un O (n ^ 2) -Situation avec une double division.


+1 Ceci semble parfait! @kaleissin dis-tu que SplitLines () ne se divise pas à toutes les pauses de la ligne (quelle que soit la convention)? Je serais surpris ...


LEN ("A \ NB \ N \ N \ NC \ ND" .Splitlines ()) == 5 LEN ("A \ RB \ R \ NC \ ND" .splitlines ()) == 4 Ceci est Python 2.6.2. Fondamentalement, quand il est mélangé, je ne fais pas l'hypothèse que "\ n" ou "\ n \ r" devrait être considérée comme une seule nouvelle ligne logique.



0
votes

Y a-t-il encore plus de convétions que \ r \ n \ et \ n ? Il suffit de remplacer \ r \ n suffit si vous ne voulez pas de lignes. xxx


2 commentaires

DOS / Windows: \ 015 \ 012 (CRLF), Unix: \ 012 (LF), Mac: \ 015 (CR).


Vous pouvez utiliser OS.LineseP qui choisira le bon caractère Newline basé sur le système d'exploitation que le code s'allume.



16
votes
mixed.replace('\r\n', '\n').replace('\r', '\n')
should handle all possible variants.

0 commentaires