2012-10-02 19 views

Respuesta

37

Utilice un búsqueda negativa hacia delante y una búsqueda hacia atrás negativo:

> s = "one two 3.4 5,6 seven.eight nine,ten" 
> parts = re.split('\s|(?<!\d)[,.](?!\d)', s) 
['one', 'two', '3.4', '5,6', 'seven', 'eight', 'nine', 'ten'] 

En otras palabras, siempre se divide por \s (espacio en blanco), y solo se divide por comas y puntos si son no seguido de (?!\d) o precedido (?<!\d) por un dígito.

DEMO.

EDITAR: Según el comentario @verdesmarald, es posible que desee utilizar el siguiente lugar:

> s = "one two 3.4 5,6 seven.eight nine,ten,1.2,a,5" 
> print re.split('\s|(?<!\d)[,.]|[,.](?!\d)', s) 
['one', 'two', '3.4', '5,6', 'seven', 'eight', 'nine', 'ten', '1.2', 'a', '5'] 

Esto dividirá en "1.2,a,5"["1.2", "a", "5"].

DEMO.

+2

creo que la OP en realidad no quiere que siguió a * y * procedido, en lugar de o, lo que debe ser '(<\ d?!) | ([,]. [,].? ! \ d) 'not' (? verdesmarald

+0

@verdesmarald: Puede que tengas razón, he editado mi respuesta para reflejar eso, gracias. –

3

Así que quiere dividir en espacios, y en comas y puntos que no están rodeados de números. Esto debería funcionar:

r" |(?<![0-9])[.,](?![0-9])" 
Cuestiones relacionadas