¿Hay una manera de subscribir una cadena?

¿Hay alguna forma de crear una cadena de cadenas en Python para obtener una nueva cadena desde el tercer carácter hasta el final de la cadena?

Tal vez como myString[2:end] ?

Si salir de la segunda parte significa ‘hasta el final’, si deja la primera parte, ¿comienza desde el principio?

 >>> x = "Hello World!" >>> x[2:] 'llo World!' >>> x[:2] 'He' >>> x[:-2] 'Hello Worl' >>> x[-2:] 'd!' >>> x[2:-2] 'llo Worl' 

Python llama a este concepto “rebanar” y funciona en algo más que cadenas. Echa un vistazo aquí para una introducción completa.

Sólo para estar completo como nadie más lo ha mencionado. El tercer parámetro de un segmento de matriz es un paso. Así que invertir una cadena es tan simple como:

 some_string[::-1] 

O seleccionar personajes alternativos sería:

 "Hello- -World"[::2] # outputs "Hello World" 

La capacidad de avanzar y retroceder a través de la cadena mantiene la coherencia con la posibilidad de organizar un segmento desde el principio o el final.

Substr () normalmente (es decir, PHP y Perl) funciona de esta manera:

 s = Substr(s, beginning, LENGTH) 

Así que los parámetros son beginning y LENGTH .

Pero el comportamiento de Python es diferente; Se espera que comience y una después de FIN (!). Esto es difícil de detectar por los principiantes. Así que el reemplazo correcto para Substr (s, begin, LENGTH) es

 s = s[ beginning : beginning + LENGTH] 

Una forma común de lograr esto es mediante el corte de cadena.

MyString[a:b] le proporciona una subcadena desde el índice a hasta (b – 1).

¿Hay alguna forma de crear una cadena de cadenas en Python para obtener una nueva cadena desde el tercer carácter hasta el final de la cadena?

Tal vez como myString[2:end] ?

Sí, esto realmente funciona si asigna, o vincula , el nombre, end , a singleton constante, None :

 >>> end = None >>> myString = '1234567890' >>> myString[2:end] '34567890' 

La notación de la rebanada tiene 3 argumentos importantes:

  • comienzo
  • detener
  • paso

Sus valores predeterminados cuando no se proporcionan son None , pero podemos pasarlos explícitamente:

 >>> stop = step = None >>> start = 2 >>> myString[start:stop:step] '34567890' 

Si salir de la segunda parte significa ‘hasta el final’, si deja la primera parte, ¿comienza desde el principio?

Sí, por ejemplo:

 >>> start = None >>> stop = 2 >>> myString[start:stop:step] '12' 

Tenga en cuenta que incluimos el inicio en la división, pero solo subimos y no incluimos la detención.

Cuando el paso es None , de forma predeterminada, la división usa 1 para el paso. Si pisas con un entero negativo, Python es lo suficientemente inteligente como para ir desde el final hasta el principio.

 >>> myString[::-1] '0987654321' 

Explico la notación de división en gran detalle en mi respuesta a la pregunta de explicar notación de división.

Parece que falta un ejemplo aquí: copia completa (superficial).

 >>> x = "Hello World!" >>> x 'Hello World!' >>> x[:] 'Hello World!' >>> x==x[:] True >>> 

Este es un lenguaje común para crear una copia de tipos de secuencia (no de cadenas internadas), [:] . Copias poco profundas de una lista, consulte la syntax de la porción de la lista de Python utilizada sin ninguna razón obvia .

Lo tienes justo ahí excepto por “fin”. Se llama notación de la rebanada. Tu ejemplo debería leer:

 new_sub_string = myString[2:] 

Si deja de lado el segundo parámetro, es implícitamente el final de la cadena.

Me gustaría agregar dos puntos a la discusión:

  1. En su lugar, puede usar None en un espacio vacío para especificar “desde el principio” o “hasta el final”:

     'abcde'[2:None] == 'abcde'[2:] == 'cde' 

    Esto es particularmente útil en funciones, donde no puede proporcionar un espacio vacío como argumento:

     def substring(s, start, end): """Remove `start` characters from the beginning and `end` characters from the end of string `s`. Examples -------- >>> substring('abcde', 0, 3) 'abc' >>> substring('abcde', 1, None) 'bcde' """ return s[start:end] 
  2. Python tiene objetos de corte :

     idx = slice(2, None) 'abcde'[idx] == 'abcde'[2:] == 'cde' 

Eso es bastante simple:

 s = 'Hello, World!' print(s[:]) # prints "Hello, World!" print(s[:5]) # prints Hello print(s[5:]) # prints , World! print(s[3:7]) # prints "lo, " 

Tal vez lo perdí, pero no pude encontrar una respuesta completa en esta página a las preguntas originales porque las variables no se analizan más a fondo aquí. Así que tuve que seguir buscando.

Como todavía no puedo comentar, permítame agregar mi conclusión aquí. Estoy seguro de que no era el único interesado cuando accedía a esta página:

  >>>myString = 'Hello World' >>>end = 5 >>>myString[2:end] 'llo' 

Si dejas la primera parte, obtienes

  >>>myString[:end] 'Hello' 

Y si dejó el: en el medio también obtuvo la subcadena más simple, que sería el quinto carácter (el recuento comienza con 0, por lo que es el espacio en blanco en este caso):

  >>>myString[end] ' ' 

Si myString contiene un número de cuenta que comienza en el desplazamiento 6 y tiene una longitud 9. entonces puede extraer el número de cuenta de esta manera: acct = myString[6:][:9] .

Si el OP acepta eso, es posible que quieran probar, de manera experimental,

 myString[2:][:999999] 

Funciona: no se genera ningún error y no se produce el ‘relleno de cadena’ predeterminado.

El uso de índices codificados en sí puede ser un desastre.

Para evitar eso, Python ofrece un slice() objeto integrado slice() .

 string = "my company has 1000$ on profit, but I lost 500$ gambling." 

Si queremos saber cuanto dinero me queda.

Solución normal:

 final = int(string[15:19]) - int(string[43:46]) print(final) >>>500 

Usando rebanadas:

 EARNINGS = slice(15, 19) LOSSES = slice(43, 46) final = int(string[EARNINGS]) - int(string[LOSSES]) print(final) >>>500 

Usando la rebanada ganas legibilidad.

Basado en la respuesta de @CopyPastelt, si desea una subcadena basada en desplazamiento y longitud:

 def substring(s, offset=None, length=None): return s[offset:][:length] 

Ejemplo de uso:

 string = 'Hello Beautiful World' substring(string) #returns 'Hello Beautiful World' substring(string,length=5) #returns 'Hello' substring(string,6,9) #returns 'Beautiful' substring(string,16) #returns 'World'