2010-04-08 16 views
8

Estoy tratando de dividir una cadena en caracteres de nueva línea (para los caracteres de nueva línea del archivo de texto de Windows, OS X y Unix). Si hay una sucesión de estos, quiero dividirlos también y no incluir ningún en el resultado.Regex para dividir en sucesiones de caracteres de nueva línea

Así, para cuando se dividen los siguientes:

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

El resultado sería:

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

Qué expresiones regulares se debe usar?

+3

¿Le preocupa otros espacios en blanco vertical? \ r \ n es DOS, pero todavía hay otros espacios en blanco verticales posibles, como la pestaña vertical y Unicode NBSP, PS, LS, NNBSP. Es posible que desee comprobar si Python admite el concepto de línea nueva genérica. Perl tiene \ v y \ R que coinciden con cualquier espacio en blanco vertical genérico o salto de línea, respectivamente. De lo contrario, si desea los caracteres Unicode, agréguelos a sus clases de caracteres [\ r \ n] + y el equivalente de Python para buscar esos caracteres Unicode. – dawg

Respuesta

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

El patrón más simple para este propósito es r'[\r\n]+' que se puede pronunciar como "uno o más de retorno de carro o caracteres de nueva línea".

+0

Sí. Eso funciona. – 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

Si no hay espacios en los arranques o extremos de las líneas, puede utilizar line.split() sin argumentos. Eliminará los dobles. . Si no, puede usar [a for a a.split("\r\n") if a].

EDITAR: el tipo str también tiene un método llamado "líneas divisorias".

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

+4

+1 para líneas divisorias –

0

Prestando atención a las normas greediness para los patrones:

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