2012-06-26 37 views
5

¿Alguien puede encontrar una solución más hermosa y más de Python?Encontrar espacios dobles en una cadena - Python

Estoy recorriendo algunas líneas de texto en un archivo, para verificar si cumplen con ciertos criterios. Por alguna razón, se decidió que los separadores internos en la línea son '', es decir, espacio doble.

¿Cómo verifico una cadena de texto para verificar que todos los separadores tengan exactamente dos espacios? Los espacios al final de la línea no son un problema, ya que inicialmente la línea es .strip() 'ed.

He escrito esto, y funciona, pero es feo. El código se mostrará a algunos Python novato, así que estoy buscando una solución más corto, más clara y más bella ...

ll = ["53.80 64-66-04.630N 52-16-15.355W 25-JUN-1993:16:48:34.00 S10293.. 2", 
     " 53.80 64-66-04.630N 52-16-15.355W 25-JUN-1993:16:48:34.00 S10293.. 2", 
     "53.80 64-66-04.630N 52-16-15.355W 25-JUN-1993:16:48:34.00 S10293.. 2", 
     " 53.80 64-66-04.630N 52-16-15.355W 25-JUN-1993:16:48:34.00 S10293.. 2", 
     "53.80 64-66-04.630N 52-16-15.355W 25-JUN-1993:16:48:34.00 S10293.. 2 ", 
     "53.80 64-66-04.630N 52-16-15.355W 25-JUN-1993:16:48:34.00 S10293.. 2 ", 
     "53.80 64-66-04.630N 52-16-15.355W 25-JUN-1993:16:48:34.00 S10293.. 2"] 

for ln in ll: 
    l = ln.strip() 
    bolDS = True 
    for n in range(len(l)-1): 
     if (n>0 and l[n]==' ' and not ((l[n]==l[n+1])^(l[n]==l[n-1]))): 
      bolDS = False 

    print "|"+l+"|",bolDS 

Respuesta

10
def is_doublespace_separated(input_string): 
    return ' '.join(input_string.split()) == input_string.strip() 

Esto funciona porque se string.split dividir su cadena en cualquier espacio en blanco. y string.join se une a la lista con el separador string. En este caso, usamos el separador ' ' (dos espacios) para volver a unir su cadena y luego compararla con la versión eliminada (creo que ya sabe qué tira).

** Esto ignorará el espacio en blanco en la parte frontal de la cuerda, así como en el extremo.

+0

Niza pequeña comparación. Simplemente eliminaría toda la parte superior y haría que la edición sea tu respuesta real – jdi

+0

@jdi - Buen punto. Siempre quiero dejar eso porque siento que le dedico un poco de trabajo, pero tienes razón en que si no aborda la pregunta, debería eliminarse. – mgilson

+1

+1 respuesta limpia. Ayudaría al próximo chico (por ejemplo, mi yo futuro) con un 'def is_doublespace_separated():' precediéndolo. – msw

4

Aquí es una solución rápida:

import re 

s = "53.80 64-66-04.630N 52-16-15.355W 25-JUN-1993:16:48:34.00 S10293.. 2" 
s2 = "53.80 64-66-04.630N 52-16-15.355W 25-JUN-1993:16:48:34.00 S10293.. 2" 

def spaceTest(line): 
    matches = re.findall(r'\s+', line.strip()) 
    return not any(m for m in matches if m != ' ') 

print spaceTest(s) 
# False 
print spaceTest(s2) 
# True 

Y uno más pequeño enfoque más simple:

s.strip().count(' ')+1 == len(s.split()) 

Esto supone que no debe haber menos 1 cantidad de separadores que hay campos.

+0

Inteligente. Me gusta tu segundo. – mgilson

+0

@mgilson: ¿Tuyo es * cabello * más rápido – jdi

+0

realmente? Habría adivinado que el tuyo sería más rápido. Ambos tenemos un 'split' y un' strip', esperaría que 'count' fuera más rápido que' join' y la comparación entera es definitivamente más rápida que la comparación de cuerda ... Weird. ¿La longitud de la cuerda es importante? – mgilson

0

Para comprobar que una línea tiene sólo dobles espacios que podría utilizar una expresión regular (aunque split/join solución mediante @mgilson podría ser más simple y más eficiente):

import re 

ok = re.match(r'(?:\S|(?<!\s) (?!\s))*$', line) 

Nota: doesn' t permite un doble espacio posterior antes de una nueva línea, example.

Cuestiones relacionadas