¿Cómo obtengo una subcadena de una cadena en Python?

¿Hay alguna manera de subcadenar una cadena 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 dejar la segunda parte significa 'hasta el final', y si deja la primera parte, ¿comienza desde el principio?

preguntado el 19 de marzo de 09 a las 15:03

Este contiene una explicación clara. pythoncentral.io/cutting-and-slicing-strings-in-python -

string [: - 1] es el más simple. -

13 Respuestas

>>> 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. Echar un vistazo aquí para una introducción completa.

contestado el 23 de mayo de 17 a las 13:05

Solo para completar, ya que nadie más lo ha mencionado. El tercer parámetro de un segmento de matriz es un paso. Entonces, invertir una cadena es tan simple como:

some_string[::-1]

O seleccionar personajes alternativos sería:

"H-e-l-l-o- -W-o-r-l-d"[::2] # outputs "Hello World"

La capacidad de avanzar y retroceder a través de la cadena mantiene la coherencia con la posibilidad de cortar en matriz desde el principio o el final.

Respondido el 04 de enero de 19 a las 23:01

@mtahmed absolutamente relacionado con la pregunta. ¿Qué pasa si quisiera crear una subcadena seleccionando caracteres alternativos de la cadena? Ese sería my_string [:: 2] - Endófago

Creo que es más probable que quisieras mencionar el tercer parámetro para cortar. La necesidad de obtener todos los demás caracteres de una cadena puede ser un caso de uso importante en alguna parte, pero nunca tuve que hacerlo. No es que haya nada de malo en querer mostrar lo que sabes; de qué sirve saber cosas si no puedes hacer eso. :) Pero el caso de relevancia para la pregunta está exagerado. - Juan Lockwood

Claro, el ejemplo específico de seleccionar caracteres alternativos puede no ser relevante para la pregunta, pero entender que hay un tercer parámetro para cortar mucho es relevante y los ejemplos simples sirven para ilustrar cómo funciona. La comunidad de Python también tiene una gran historia en la educación de nuevos miembros de una manera amigable :-) - Endófago

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

s = Substr(s, beginning, LENGTH)

Entonces los parámetros son beginning y LENGTH.

Pero el comportamiento de Python es diferente; espera el comienzo y uno después del FIN (!). Esto es difícil de detectar por principiantes. Entonces, el reemplazo correcto para Substr (s, begin, LENGTH) es

s = s[ beginning : beginning + LENGTH]

Respondido el 22 de junio de 18 a las 16:06

Los principiantes deben aprender la forma pitónica al pasar a Python, no apegarse a otros hábitos lingüísticos. Nicu Surdu

Y solo para completar, Java es como Python en que el método String.substring () toma start y one-past-end. Este solo me mordió fuerte, había asumido que era largo como cualquier otra función de subcadena en el mundo. - philhibbs

Una forma (probablemente) más pitónica de hacerlo es s[beginning:][:length] - victortv

Como alguien que comenzó con Python en lugar de [palabra sucia] -lenguajes como PHP, creo que Python es mucho más simple e intuitivo con su cadena [principio: fin]. La longitud generalmente no es relevante. - ojo brillante

Una forma común de lograr esto es cortando cuerdas.

MyString[a:b] le da una subcadena del índice a al (b - 1).

Respondido el 02 de enero de 19 a las 16:01

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

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

Este es un modismo común para crear una copia de tipos de secuencia (no de cadenas internas), [:]. Superficial copia una lista, consulte La sintaxis de segmento de lista de Python se usa sin una razón obvia.

Respondido el 02 de enero de 19 a las 16:01

Esto no tiene casi nada que ver con la pregunta sobre la subcadena. Ni siquiera se aplica a la cuerda. Decir stringA = stringB es suficiente ... - Nicu Surdu

La copia completa [:] crea una COPIA NUEVA, usa sintaxis de sector y se lee como "subcadena de principio a fin" - gimel

¿Cuál es el punto ya que las cuerdas son inmutables? a=b debería ser suficiente. - bfontaine

@gimel: En realidad, [:] en un tipo inmutable no hace una copia en absoluto. Tiempo mysequence[:] es sobre todo inofensivo cuando mysequence es un tipo inmutable como str, tuple, bytes (Py3) o unicode (Py2), a = b[:] es equivalente a a = b, solo pierde un poco de tiempo enviando los códigos de bytes de corte a los que el objeto responde regresando a sí mismo, ya que no tiene sentido hacer una copia superficial cuando, aparte de las pruebas de identidad del objeto, es equivalente a simplemente devolver otra referencia al yo inmutable de uno. - ShadowRanger

Intentando resumir las otras críticas de esta respuesta: en Python, las cadenas son inmutables, por lo tanto, no hay razón para hacer una copia de una cadena, por lo que s[:] no hace una copia en absoluto: s = 'abc'; s0 = s[:]; assert s is s0. Sí, era la forma idiomática de copiar una lista en Python hasta que las listas se obtuvieron list.copy, pero una porción completa de un tipo inmutable no tiene ninguna razón para hacer una copia porque no se puede cambiar, por lo que es posible que solo haya una en la memoria y no deberíamos perder el tiempo en copiarla. Dado que esta respuesta es incorrecta y ni siquiera responde la pregunta - ¿Debería eliminarse? - Aaron Hall ♦

¿Hay alguna manera de subcadenar una cadena 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 se unen, el nombre,end, a singleton constante, None:

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

La notación de sector tiene 3 argumentos importantes:

  • comienzo
  • detener
  • paso

Sus valores predeterminados cuando no se dan son None - pero podemos pasarlos explícitamente:

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

Si dejar 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 el segmento, pero solo subimos y no incluimos la parada.

Cuando el paso es None, de forma predeterminada, el segmento usa 1 para el paso. Si da un paso con un número entero negativo, Python es lo suficientemente inteligente como para ir del final al principio.

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

Explico la notación de corte con gran detalle en mi respuesta a la pregunta Explicar la notación de rebanadas.

Respondido el 20 de junio de 20 a las 10:06

Lo tienes ahí, excepto por "final". Se llama notación de corte. Su ejemplo debería leer:

new_sub_string = myString[2:]

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

Respondido el 22 de junio de 18 a las 16:06

Si myString contiene un número de cuenta que comienza en la compensación 6 y tiene una longitud de 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 ningún 'relleno de cadena' predeterminado.

Respondido el 05 de Septiembre de 19 a las 12:09

Creo que si quieres usar este método myString[offset:][:length] en el caso de OP puedes usar myString[offset:][:] - victortv

@VictorVal La respuesta es para aquellos (como yo) que han aprendido Python como un segundo (tercer, cuarto, ...) lenguaje de programación y quieren algunos 'ganchos de sintaxis' familiares para acercarse al lenguaje. Cualquier experto en el idioma probablemente verá mi respuesta como un poco tonta. - copiarpegar

¿Deberían marcarse respuestas como esta para su eliminación? Otras respuestas explican una solución similar mucho mejor, y ver esta me hizo rascarme la cabeza y buscar Python durante unos minutos antes de darme cuenta de que es solo ese tipo de respuesta. - Sebi

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

  1. Puedes usar None en su lugar, 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 rebanada objetos:

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

Respondido el 30 de diciembre de 16 a las 22:12

Bueno, tuve una situación en la que necesitaba traducir un script PHP a Python, y tenía muchos usos de substr(string, beginning, LENGTH).
Si elijo Python string[beginning:end] Tendría que calcular bastante de índices finales, por lo que la forma más sencilla era utilizar string[beginning:][:length], me ahorró muchos problemas.

Respondido 29 Abr '20, 19:04

Tal vez me lo perdí, pero no pude encontrar una respuesta completa en esta página a la (s) pregunta (s) original (es) porque las variables no se discuten más aquí. Así que tuve que seguir buscando.

Como todavía no puedo comentar, permítanme agregar mi conclusión aquí. Estoy seguro de que no era el único interesado en él al acceder a esta página:

 >>>myString = 'Hello World'
 >>>end = 5

 >>>myString[2:end]
 'llo'

Si dejas la primera parte, obtienes

 >>>myString[:end]
 'Hello' 

Y si dejaste: en el medio también obtendrás la subcadena más simple, que sería el quinto carácter (cuenta comenzando con 5, por lo que es el espacio en blanco en este caso):

 >>>myString[end]
 ' '

respondido 18 mar '15, 12:03

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

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

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

Si queremos saber cuánto dinero me queda.

Solución normal:

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

Usando rodajas:

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

Al usar slice, gana legibilidad.

Respondido el 22 de junio de 18 a las 16:06

Quizás este no sea el mejor ejemplo, porque los índices codificados permanecen y la legibilidad proviene de variables intermedias, que podría haber usado en el primer ejemplo. - asalazar

a="Helloo"
print(a[:-1])

En el código anterior, [: -1] declara imprimir desde el inicio hasta el límite máximo-1.

PRODUCCIÓN :

>>> Hello

Nota: Aquí un [: -1] también es lo mismo que un [0: -1] y un [0: len (a) -1]

a="I Am Siva"
print(a[2:])

SALIDA:

>>> Am Siva

En el código anterior, a [2:] declara imprimir a desde el índice 2 hasta el último elemento.

Recuerde que si establece el límite máximo para imprimir una cadena, como (x), imprimirá la cadena hasta (x-1) y también recuerde que el índice de una lista o cadena siempre comenzará desde 0.

Respondido 03 Jul 20, 15:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.