owned this note
owned this note
Published
Linked with GitHub
---
title: PRO-Cadenas II en Python
tags: pro,ut1,cadenas,talk,presentación
description: Cadenas II en Pytho
slideOptions:
theme: white
transition: 'fade'
center: true
slideNumber: true
spotlight:
enabled: false
---
# 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
```

---
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 ...

---
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)