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

2145

¿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?

Joan Venge
fuente
1
Este contiene una explicación clara pythoncentral.io/cutting-and-slicing-strings-in-python
mario ruiz

Respuestas:

3178
>>> 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 "segmentación" y funciona en algo más que cadenas. Echa un vistazo aquí para una introducción completa.

Paolo Bergantino
fuente
401

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

some_string[::-1]

O seleccionar caracteres 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 capacidad de agrupar rebanadas desde el principio o el final.

Endophage
fuente
21
@mtahmed absolutamente relacionado con la pregunta. ¿Qué sucede si desea subcadenas seleccionando caracteres alternativos de la cadena? Eso sería my_string [:: 2]
Endophage
Creo que es más probable que quieras 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 he tenido 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 es exagerado.
John Lockwood
1
Claro, el ejemplo específico de seleccionar caracteres alternativos puede no ser relevante para la pregunta, pero comprender que hay un tercer parámetro para dividir mucho es relevante y los ejemplos simples sirven para ilustrar cómo funciona. La comunidad Python también tiene una gran historia de educación de nuevos miembros de una manera amigable :-)
Endophage
127

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

s = Substr(s, beginning, LENGTH)

Entonces los parámetros son beginningy LENGTH.

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

s = s[ beginning : beginning + LENGTH]
Michał Leon
fuente
76
Los principiantes deben aprender la forma pitónica al mudarse a Python, no apegarse a otros hábitos de lenguaje
Nicu Surdu
3
Y solo para completar, Java es como Python en que el método String.substring () toma inicio y un pasado. Este me mordió con fuerza, supuse que era largo como cualquier otra función de subcadena en el mundo.
PhilHibbs
44
Una (probablemente) forma más pitónica de hacerlo ess[beginning:][:length]
victortv
2
Como alguien que comenzó con Python en lugar de [lenguaje sucio] como PHP, creo que Python es mucho más simple e intuitivo con su cadena [principio: fin]. La longitud generalmente no es relevante.
Gloweye
60

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

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

codingcientífico
fuente
23

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 la creación de una copia de tipos de secuencias (no de cadenas internados), [:]. Shallow copia una lista, vea la sintaxis de corte de lista de Python utilizada sin razón obvia .

gimel
fuente
12
Esto no tiene casi nada que ver con la pregunta sobre la subcadena. Ni siquiera se aplica a la cadena. Decir stringA = stringB es suficiente ...
Nicu Surdu
2
La copia completa [:] crea una NUEVA COPIA, utiliza la sintaxis de corte y se lee como "subcadena de principio a fin"
gimel
2
¿Cuál es el punto ya que las cadenas son inmutables? a=bDebería ser suficiente.
bfontaine
1
@gimel: En realidad, [:]en un tipo inmutable no se hace una copia. Si bien mysequence[:]es sobre todo inofensivo cuando mysequencees un tipo inmutable como str, tuple, bytes(AP3) o unicode(Py2), a = b[:]es equivalente a a = b, que sólo los desechos de un poco de tiempo el envío de los códigos de bytes de rebanado cual responde el objeto a por devolución de sí mismo, ya que no tiene sentido copia superficial cuando , aparte de las pruebas de identidad de objeto, es equivalente a devolver otra referencia al yo inmutable de uno.
ShadowRanger
3
El intento de resumir las otras críticas a esta respuesta: En Python, las cadenas son inmutables, por lo tanto, no hay ninguna 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 se obtuvieron las listas 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 puede haber solo una en la memoria y No debemos perder el tiempo copiándolo. Dado que esta respuesta es incorrecta y ni siquiera responde la pregunta , ¿debería eliminarse?
Aaron Hall
18

¿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 vincula el nombre enda singleton constante None:

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

La notación de corte 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?

Si, por ejemplo:

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

Tenga en cuenta que incluimos start en el segmento, pero solo subimos, y no incluimos, stop.

Cuando el paso es None, de forma predeterminada, el segmento se utiliza 1para 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 corte con gran detalle en mi respuesta a la pregunta Explicar la notación de corte.

Aaron Hall
fuente
8

Lo tienes justo a excepción de "fin". 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.

Bouvard
fuente
6

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

  1. En su Nonelugar, puede usar 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'
Ostrokach
fuente
6

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 un "relleno de cadena" predeterminado.

CopyPasteIt
fuente
1
Creo que si desea utilizar este método myString[offset:][:length]en el caso de OP, simplemente puede usarlomyString[offset:][:]
Victortv
1
@VictorVal La respuesta es para aquellos (como yo) que aprendieron Python como un segundo (3er, 4to, ...) 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.
CopyPasteIt
¿Deben marcarse las 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
3

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

Como todavía no se me permite comentar, permítanme agregar mi conclusión aquí. Estoy seguro de que no fui el único interesado en 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 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]
 ' '
Rudi Uhl
fuente
1

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 escogiera Python, string[beginning:end]tendría que calcular muchos índices finales, por lo que la forma más fácil de usar fue string[beginning:][:length]que me ahorró muchos problemas.

Edson Horacio Junior
fuente
0

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

Para evitar eso, Python ofrece un objeto incorporado 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 rebanadas:

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

Usando el corte obtienes legibilidad.

levi
fuente
55
Quizás este no sea el mejor ejemplo, porque los índices codificados permanecen y la legibilidad proviene de variables intermedias, que podría haber utilizado en el primer ejemplo.
ASalazar