# Cadenas de caractéres II <!-- Put the link to this slide here so people can follow --> slide: https://hackmd.io/@ichigar/rkjEFvUYY --- ### Introducción En el apartado 4 de los apuntes vimos: * En que consisten las cadenas de texto * El uso de comillas simples, dobles y triples * El uso de secuencias de escape para mostrar caracteres especiales * Las operaciones `+`y `*` * Las cadenas en bruto (raw) * Posteriormente vimos las cadenas con formato o formateadas * En este apartado veremos otros aspectos --- ### Longitud de una cadena. La función `len()` * `len()` devuelve el número de caracteres de una cadena **Ejemplos**: ```python >>> print(len("hola")) 4 >>> print(len("\n")) 1 >>> nombre = "Antonio" >>> print(len(nombre)) 7 ``` --- ## Accediendo a un determinado carácter o carácteres de una cadena --- ### Usando indexación de cadenas * Podemos acceder determinado caracter de una cadena usando operador de indexado. * Cada letra, espacio o símbolo en una cadena tiene una posición denominada índice. * Posición es usando corchetes `[]` y entero con posición * El índice empieza a contar por `0` --- ```python >>> word = "POKEMON" >>> print(word[0]) P >>> print(word[3]) E >>> print(word[6]) N ``` ![](https://teachen.info/cspp/_images/strindex.svg) --- Si intentamos acceder posición mayor que longitud de cadena obtendremos un mensaje de error: ```python >>> word = "POKEMON" >>> print(word[10]) Traceback (most recent call last): File "<input>", line 1, in <module> print(word[10]) IndexError: string index out of range ``` --- ### Indexado con números negativos * Podemos usar números negativos cómo índice * Con `-1` accederemos al último carácter, `-2` al penúltimo ... ![](https://i.imgur.com/m6G3rAV.png) --- Ejemplos: ```python >>> word = 'Hola, mundo' >>> print(word[-1]) o >>> print(word[-2]) d >>> print(word[-3]) n >>> print(word[-7]) , ``` --- ### Usando indexado para modificar cadena de caracteres * Cadenas objetos de tipo **inmutable** * Operador de índice podemos usar para **leer** * No para **modificar** contenido. * Si lo intentamos obtenemos un error. --- ```python >>> word = "POKEMON" >>> word[1] = "A" Traceback (most recent call last): File "<input>", line 1, in <module> word[1] = "A" TypeError: 'str' object does not support item assignment ``` --- ### Subcadenas con recorte de cadenas * Permiten obtener: * Varios caracteres de una cadena * Una parte de ella o subcadena. * Ponemos rango de la forma **[a:b]**. * Comportamiento es similar listas. * **a** posición de inicio subcadena (incluyendo este índice) * **b** posición termina subcadena (**excluyendo** este índice) --- **Ejemplos**: ```python >>> frase = "qué bien lo pasamos!" >>> frase[0:3] 'qué' >>> frase[4:8] 'bien' >>> frase[8:13] ' lo p' ``` --- * También se pueden usar índices negativos * Los índices negativos empiezan a contar por el final de la cadena: ```python >>> frase = "qué bien lo pasamos!" >>> frase[-5:-1] 'amos' >>> frase[-5:] 'amos!' ``` --- * Opcional tercer parámeretro que indica un incremento ```python >>> frase = "qué bien lo pasamos!" >>> frase[::2] 'qébe opsms' >>> frase[4:20:3] 'bnoam!' ``` --- * Si intentamos con índices mayores a la longitud de la cadena no devuelve error * Toma como referencia posición último carácter ```python >>> frase = "qué bien lo pasamos!" >>> frase[4:20] 'bien lo pasamos!' >>> frase[4:30] 'bien lo pasamos!' ``` --- Ej: 1, 2, 3 --- ### Dividir una cadena * Objetos de tipo cadena incluyen método `split()` * Convierte cadena de texto en una lista. ```python >>> texto = 'No por mucho madrugar ciento volando' >>> texto.split() ['No', 'por', 'mucho', 'madrugar', 'ciento', 'volando'] ``` --- * **split()** utiliza por defecto separadores: * secuencia de espacios en blanco * tabuladores * saltos de línea * Podemos especificar el caracter separador como parámetro: ```python >>> estuche = 'lápiz, goma, afilador, regla' >>> estuche.split(', ') ['lápiz', 'goma', 'afilador', 'regla'] ``` --- Ej: 4, 5 --- ### Limpiar cadenas * Al leer datos fuentes externas suelen incluir caractéres de relleno * Método **strip()** limpia por defecto, los espacios en blanco, saltos de línea (`\n`) y tabuladores (`\t`) ```python >>> html = ' \n \t <ul><li>item1</li><li>item2</li></ul> \n\t\t\t' >>> html.strip() '<ul><li>item1</li><li>item2</li></ul>' ``` * Cadena original no se modifica --- * Si solo queremos limpiar antes o después la cadena podemos usar los métodos `lstrip()` y `rstrip()` ```python >>> html = ' \n \t \n <ul><li>item1</li><li>item2</li></ul> \n\t\t\t' >>> html.lstrip() '<ul><li>item1</li><li>item2</li></ul> \n\t\t\t' >>> html.rstrip() ' \n \t \n <ul><li>item1</li><li>item2</li></ul>' ``` --- ### Realizar búsquedas * Varios métodos para realizar búsquedas en cadenas. * Métodos `startswith()`y `endswith()` devuelven `True` si la cadena empieza o termina respectivamente por texto a buscar. ```python >>> zen_python = '''Beautiful is better than ugly. ... Explicit is better than implicit. ... Simple is better than complex. ... Complex is better than complicated. ... Flat is better than nested.''' >>> zen_python.startswith('Beautiful') True >>> zen_python.endswith('ted.') True ``` --- Ej: 6 --- * Para buscar primera ocurrencia de subcadena con `find()` o `index()` ```python >>> zen_python = '''Beautiful is better than ugly. ... Explicit is better than implicit. ... Simple is better than complex. ... Complex is better than complicated. ... Flat is better than nested.''' >>> zen_python.find('than') 20 >>> zen_python.index('than') 20 ``` --- * Devuelven el índice priemra aparición * Comportamiento diferente cuando subcadena no existe ```python >>> zen_python = '''Beautiful is better than ugly. ... Explicit is better than implicit. ... Simple is better than complex. ... Complex is better than complicated. ... Flat is better than nested.''' >>> zen_python.find('java') -1 >>> zen_python.index('java') Traceback (most recent call last): File "<input>", line 1, in <module> zen_python.index('java') ValueError: substring not found ``` --- ### Contar aparición de subcadena * **count()** permite contabilizar número de veces que aparece subcadena ```python >>> zen_python = '''Beautiful is better than ugly. ... Explicit is better than implicit. ... Simple is better than complex. ... Complex is better than complicated. ... Flat is better than nested.''' >>> zen_python.count('better') 5 ``` --- Ej 7 --- ### Reemplazar elementos * `replace()` permite reemplazar una subcadena por otra ```python >>> zen_python = '''Beautiful is better than ugly. ... Explicit is better than implicit. ''' >>> zen_python.replace('better', 'worst' ) 'Beautiful is worst than ugly.\nExplicit is worst than implicit.' ``` --- * Podemos especificar el número de reemplazos ```python >>> zen_python = '''Beautiful is better than ugly. ... Explicit is better than implicit. ... Simple is better than complex. ... Complex is better than complicated. ... Flat is better than nested.''' >>> zen_python.replace('better', 'worst', 2 ) 'Beautiful is worst than ugly.\nExplicit is worst than implicit.\nSimple is better than complex.\nComplex is better than complicated.\nFlat is better than nested.' ``` --- ### Mayúsculas y minúsculas * Métodos para pasar a mayúsculas o minúsculas caracteres ```python >>> refran = 'no por mucho madrugar AMANECE más temprano' >>> refran.capitalize() 'No por mucho madrugar amanece más temprano' >>> refran.title() 'No Por Mucho Madrugar Amanece Más Temprano' >>> refran.upper() 'NO POR MUCHO MADRUGAR AMANECE MÁS TEMPRANO' >>> refran.lower() 'no por mucho madrugar amanece más temprano' >>> refran.swapcase() 'NO POR MUCHO MADRUGAR amanece MÁS TEMPRANO' ``` --- Ej: 8, 9 --- ## Referencias * [CSP Python - Indexado de caracteres](https://teachen.info/cspp/unit2/u0202-strindex.html)
{"metaMigratedAt":"2023-06-16T15:39:59.698Z","metaMigratedFrom":"YAML","title":"PRO-Cadenas II en Python","breaks":true,"description":"Cadenas II en Pytho","slideOptions":"{\"theme\":\"white\",\"transition\":\"fade\",\"center\":true,\"slideNumber\":true,\"spotlight\":{\"enabled\":false}}","contributors":"[{\"id\":\"c266cbca-3d39-40da-b70a-fce5d89de050\",\"add\":9915,\"del\":4107}]"}
    317 views