2010-04-08 9 views
8

Sto provando a dividere una stringa su caratteri di nuova riga (catering per Windows, OS X e Unix file di testo caratteri di nuova riga). Se c'è una successione di questi, voglio dividere anche su quello e non includere qualsiasi nel risultato.Regex da dividere in successioni di caratteri di nuova riga

Così, per quando si divide il seguente:

"Foo\r\n\r\nDouble Windows\r\rDouble OS X\n\nDouble Unix\r\nWindows\rOS X\nUnix" 

Il risultato sarebbe:

['Foo', 'Double Windows', 'Double OS X', 'Double Unix', 'Windows', 'OS X', 'Unix'] 

Cosa regex devo usare?

+3

Siete preoccupati per altri spazi bianchi in verticale? \ r \ n è DOS, ma ci sono ancora altri possibili spazi bianchi verticali come la scheda verticale e Unicode NBSP, PS, LS, NNBSP. Potresti voler controllare se Python supporta il concetto di newline generico. Perl ha \ v e \ R che corrispondono rispettivamente a spazi vuoti generici o linefeed. In caso contrario, se si desidera i caratteri Unicode, aggiungere quelli alle classi di caratteri [\ r \ n] + e l'equivalente Python di cercare quei caratteri Unicode. – dawg

risposta

3
re.split(r'[\n\r]+', line) 
6

Il modello più semplice per questo scopo è r'[\r\n]+' che si può pronunciare come "uno o più ritorno a capo o caratteri di nuova riga".

+0

Sì. Che funzioni. – dawg

1
>>> s="Foo\r\n\r\nDouble Windows\r\rDouble OS X\n\nDouble Unix\r\nWindows\rOS X\nUnix" 
>>> import re 
>>> re.split("[\r\n]+",s) 
['Foo', 'Double Windows', 'Double OS X', 'Double Unix', 'Windows', 'OS X', 'Unix'] 
20

Se non ci sono spazi alle inizia o estremità delle linee, è possibile utilizzare line.split() senza argomenti. Rimuoverà i doppi. . In caso contrario, è possibile utilizzare [a for a a.split("\r\n") if a].

MODIFICA: il tipo str ha anche un metodo chiamato "linee di divisione".

"Foo\r\n\r\nDouble Windows\r\rDouble OS X\n\nDouble Unix\r\nWindows\rOS X\nUnix".splitlines()

+4

+1 per linee di divisione –

0

Prestando attenzione alle regole golosità per i modelli:

pattern = re.compile(r'(\r\n){2,}|(\n\r){2,}|(\r){2,}|(\n){2,}') 
paragraphs = pattern.split(text) 
Problemi correlati