2011-11-17 9 views
5

Quiero quitar todos los caracteres después de un tercer carácter, por ejemplo, por ejemplo.Strip cadena después de la tercera aparición del carácter python

Encontré este código en línea y funciona, pero tengo problemas para aprender cómo funciona y quería preguntar para poder entenderlo por completo.

def indexList(s, item, i=0): 
    """ 
    Return an index list of all occurrances of 'item' in string/list 's'. 
    Optional start search position 'i' 
    """ 
    i_list = [] 
    while True: 
     try: 
      i = s.index(item, i) 
      i_list.append(i) 
      i += 1 
     except: 
      break 
    return i_list 

def strip_chrs(s, subs): 
    for i in range(indexList(s, subs)[-1], len(s)): 
     if s[i+1].isalpha(): 
      return data[:i+1] 

data = '115Z2113-3-777-55789ABC7777' 
print strip_chrs(data, '-') 

aquí está mi pregunta en el while True: línea de lo que es verdad? También en el excepto: ¿excepto qué? y ¿por qué se codifica una ruptura allí?

¡Gracias de antemano!

+0

¿Por qué se etiqueta este Python 3.x? Utiliza la sintaxis de Python 2.x en su declaración 'print'. –

+0

¿Estás tratando de despojar a todos los personajes después de la tercera aparición de otro? Entonces, en su ejemplo de 'datos' ¿está tratando de eliminar todo después de' 115Z2113-3-777'? – Casey

+0

Sí, 55789ABC7777 debe ser eliminado. Etiqueté Python 3.x porque actualmente lo estoy aprendiendo.Quitaré la etiqueta aunque mis disculpas – canyon289

Respuesta

22

Aquí manera:

def trunc_at(s, d, n=3): 
    "Returns s truncated at the n'th (3rd by default) occurrence of the delimiter, d." 
    return d.join(s.split(d, n)[:n]) 

print trunc_at("115Z2113-3-777-55789ABC7777", "-") 

Cómo funciona:

  1. La cadena s se divide en una lista en cada ocurrencia del delimitador d usando s.split(d). Usamos el segundo argumento en split para indicar el número máximo de divisiones por hacer (ya que no hay razón para seguir dividiéndose después de las primeras n veces). El resultado es una lista, como ["115Z2113", "3", "777", "55789ABC7777"]
  2. Una porción de los primeros n elementos de la lista se toma usando [:n]. El resultado es otra lista, como ["115Z2113", "3", "777"]
  3. La lista se unió de nuevo en una cadena, colocando el delimitador d entre cada elemento de la lista, utilizando d.join(...), dando como resultado, por ejemplo, "115Z2113-3-777"
+0

Me likee. Límites de longitud estúpidos. –

+0

+1 por su simplicidad y +1 por no usar itertools :) –

4

La línea

while True: 

crea un bucle infinito. Simplemente va a seguir girando hasta que el programa falle o se llame a break. La línea except es un controlador de excepción que capturará cualquier excepción, en cuyo punto break se llama salir del bucle infinito.

1

En el "while True", True es simplemente el valor constante True. Así que mientras True es un ciclo para siempre o hasta que se rompa.

el excepto está utilizando la excepción que ocurre cuando el índice no encuentra más cadenas después de i como una forma de romper el ciclo. Esto es algo malo.

intentar algo como esto (pseudocódigo):

while you still have string left: 
    get index of next '-' 
    if found, add 1 to count 
    if count == 3: 
     return s[index+1:] 

los s[index+1:] devuelve la subcadena del carácter siguiente índice, hasta el final.

7

En una forma de una sola línea:

data = '115Z2113-3-777-55789ABC7777' 
strip_character = "-" 
>>> strip_character.join(data.split(strip_character)[:3]) 
'115Z2113-3-777' 
Cuestiones relacionadas