¿Hay alguna manera de substring una cadena en Python?


¿Hay una manera de substring una cadena en Python, para obtener una nueva cadena desde el 3er carácter hasta el final de la cadena?

Tal vez como myString[2:end]?

Si dejar la segunda parte significa "hasta el final", si dejas la primera parte, ¿empieza desde el principio?

 1656
Author: Robert Harvey, 2009-03-19

10 answers

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

 2508
Author: Paolo Bergantino,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:51

Solo para completar 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 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 consistencia con la posibilidad de dividir la matriz desde el principio o el final.

 314
Author: Endophage,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-05 16:58:56

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; espera principio y uno después de FIN (!). Esto es difícil de detectar por los principiantes. Así que el reemplazo correcto para Substr(s, principio, LONGITUD) es

s = s[ beginning : beginning + LENGTH]
 95
Author: Michał Leon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-22 15:24:49

Una forma común de lograr esto es cortando cadenas. MyString[a:b] le da una subcadena del índice a a (b - 1)

 45
Author: codingscientist,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-16 21:55:23

Un ejemplo parece faltar 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 internadas). [:] Shallow copia una lista, Ver python-list-slice-used-for-no-obvious-reason.

 16
Author: gimel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:02:48

¿Hay una manera de substring una cadena en Python, para obtener una nueva cadena desde el 3er carácter hasta el final de la cadena?

Tal vez como myString[2:end]?

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

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

La notación Slice tiene 3 argumentos importantes:

  • start
  • stop
  • paso

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

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

Si dejar la segunda parte significa "hasta el final", si dejas la primera parte, ¿comienza desde el principio?

Sí, por ejemplo:

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

Ten en cuenta que incluimos start en el slice, pero solo subimos a, y no incluimos, stop.

Cuando step es None, por defecto el slice usa 1 para el paso. Si das un paso con un entero negativo, Python es lo suficientemente inteligente como para ir del final al principio.

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

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

 14
Author: Aaron Hall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-30 02:00:07

Lo tienes justo ahí excepto por "fin". Se llama notación de corte. Su ejemplo debe decir:

new_sub_string = myString[2:]

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

 7
Author: bouvard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-22 15:23:28

Quisiera añadir dos puntos al debate:

  1. Puede 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 se 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 cortar objetos:

    idx = slice(2, None)
    'abcde'[idx] == 'abcde'[2:] == 'cde'
    
 6
Author: ostrokach,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-30 22:36:32

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.

Dado que todavía no se me permite 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 dejas el : en el medio también tienes la subcadena más simple, que sería el 5to carácter (contar a partir de 0, por lo que es el espacio en blanco en este caso):

 >>>myString[end]
 ' '
 2
Author: Rudi Uhl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-18 12:01:43

Usar índices codificados puede ser un desastre.

Para evitar esto, 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 slices:

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

Usando slice usted gana legibilidad.

 0
Author: levi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-22 15:26:57