Uma string é uma sequência de caracteres. Um carácter é um símbolo. Por exemplo, o idioma inglês tem 26 caracteres.
Os computadores não trabalham diretamente com caracteres, mas com números em binário. Mesmo que veja os caracteres no ecrã, internamente, eles são armazenados e manipulados como uma combinação de 0's e 1's.
Esta conversão de caracteres para números é chamada de encoding. Para fazer esta codificação, são usadas tabelas que fazem corresponder a cada carácter um código numérico (que pode ser escrito em decimal, octal, hexadecimal ou binário). As tabelas ASCII e Unicode são algumas das codificações mais comuns.
Em Python, uma string é uma sequência de caracteres Unicode. O Unicode foi introduzido para incluir todos os caracteres de todas as línguas e trazer uniformidade na codificação.
Consulte mais informações sobre a tabela ASCII aqui.
Consulte mais informações sobre a tabela Unicode aqui.
Exemplo:
>>> print(ord("5")) # Código do carácter 5
53
>>> print(ord("A")) # Código do carácter A
65
>>> print(ord("%")) # Código do carácter %
37
>>> print(chr(65)) # Imprime o carácter com o código 53
A
As strings são criadas ao colocar caracteres dentro de aspas simples (plicas) ou duplas. Mesmo aspas triplas podem ser usadas, mas representam, geralmente, strings com múltiplas linhas.
Exemplos:
# As strings seguintes são equivalentes
my_string = 'Olá Mundo'
print(my_string)
my_string = "Olá Mundo"
print(my_string)
my_string = '''Olá Mundo'''
print(my_string)
# As strings com aspas triplas podem ocupar várias linhas
my_string = """Olá, Bem-Vindo
ao Mundo do Python"""
print(my_string)
Olá Mundo
Olá Mundo
Olá Mundo
Olá, Bem-Vindo
ao Mundo do Python
Como aceder a caracteres numa string?
Podemos aceder a caracteres individuais, usando indexação, e a uma série de caracteres, usando fatiar (com o operador de corte :).
Note-se:
Os índices começam a partir de 0.
Tentando aceder a um carácter fora do intervalo de índices, irá dar erro.
O índice deve ser um número inteiro. Não podemos usar float ou outros tipos de dados, pois isso resultará num erro.
O Python permite a indexação negativa das suas sequências (como acontece nas listas). O índice -1 refere-se ao último item, -2 ao penúltimo item e assim por diante. Podemos aceder a um intervalo de itens de uma string usando o operador de corte (dois pontos).
s = 'programar'
print('s = ', s)
# Primeiro carácter
print('s[0] = ', s[0])
# Último carácter
print('s[-1] = ', s[-1])
# Do 2º ao 5º carácter
print('s[1:5] = ', s[1:5])
# D 6º ao penúltimo carácter
print('s[5:-2] = ', s[5:-2])
s = programar
s[0] = p
s[-1] = r
s[1:5] = rogr
s[5:-2] = am
No exemplo seguinte, é emitido um erro uma vez que é fornecido um índice fora do intervalo:
>>> my_string="Ola"
>>> my_string[3]
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
my_string[3]
IndexError: string index out of range
As strings são imutáveis. Isso significa que os caracteres individuais de uma string não podem ser alterados ou eliminados. Podemos simplesmente reatribuir diferentes strings para a mesma variável.
Exemplo:
>>> nome="Paolo?"
>>> nome[2]="u" # Tentativa de alterar o 3º carácter de o para u
Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
nome[2]="u"
TypeError: 'str' object does not support item assignment
>>> del nome[-1] # Tentativa de eliminar o último carácter
Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
del nome[-1]
TypeError: 'str' object doesn't support item deletion
>>> nome="Paulo" # Substituir toda a string
>>> nome
'Paulo'
Concatenação de duas ou mais strings
A união de duas ou mais strings numa única é chamada concatenação. O operador + faz isso em Python. O operador * pode ser usado para repetir a sequência de caracteres um determinado número de vezes.
Exemplo:
s1="Olá"
s2="Mundo!"
# Usando +
print('s1 + s2 = ', s1 + s2)
# Usando *
print('s1 * 3 =', s1 * 3)
s1 + s2 = OláMundo!
s1 * 3 = OláOláOlá
Iteração numa string
Usando um ciclo podemos iterar através de uma cadeia de caracteres.
Exemplo (conta o número de ocorrências da letra «l» numa string):
c = 0
for letra in 'Hello World':
if letra == 'l':
c += 1
print('Foram encontradas',c,'ocorrências da letra «l»')
Foram encontradas 3 ocorrências da letra «l»
Verificação da existência de uma string dentro de outra
Podemos testar se uma sequência de caracteres existe dentro de outra, usando a keyword in.
>>> 'a' in 'programa'
True
>>> 'bat' not in 'batalha'
False
Funções incorporadas (built-in) para trabalhar com strings em Python
Existem várias funções internas que trabalham com sequências (um exemplo de uma sequência é uma lista), que também podem ser usadas com strings. Algumas das mais utilizadas são enumerate() e len().
A função enumerate() retorna um objeto enumerate. Esse objeto contém o índice e o valor de todos os itens da string, o que é útil, por exemplo, para o iterar.
Da mesma forma, len() retorna o comprimento (número de caracteres) da string.
Exemplo:
s = 'frio'
# enumerate()
lista_enumeravel = list(enumerate(s))
print('list(enumerate(s)) = ', lista_enumeravel)
for i,v in lista_enumeravel:
print(i,v)
# Número de caracteres
print('len(s) = ', len(s))
list(enumerate(s)) = [(0, 'f'), (1, 'r'), (2, 'i'), (3, 'o')]
0 f
1 r
2 i
3 o
len(s) = 4
Sequências de escape
Se quisermos imprimir um texto como - He said, "What's there?" - não podemos usar aspas simples ou aspas duplas. Isso resultará em SyntaxError, pois o texto contém aspas simples e duplas e estaremos a usar "aspas dentro de aspas".
>>> print ("He said, "What's there?"")
...
SyntaxError: sintaxe inválida
>>> print ('He said, "What's there?"")
...
SyntaxError: sintaxe inválida
Uma maneira de contornar este problema é usar as aspas triplas. Alternativamente, podemos usar sequências de escape (que tiraram o significado específico ao carácter seguinte, interpretando-o como um carácter sem significado especial para o Python).
Uma sequência de escape começa com uma barra invertida (\), seguida do carácter ao qual queremos tirar o significado. Se usarmos aspas simples para representar a string, todas as aspas simples dentro da sequência de caracteres devem ser "escaped". O caso das aspas duplas é similar.
Exemplo:
# Usando aspas triplas
print('''He said, "What's there?"''')
# Usando aspas simples
print('He said, "What\'s there?"')
# Usando aspas duplas
print("He said, \"What's there?\"")
Lista de todas as sequências de escape suportadas pelo Python
Exemplo:
>>> print("C:\\Python32\\Lib")
C:\Python32\Lib
>>> print("Texto na linha 1\ntexto na linha 2")
Texto na linha 1
texto na linha 2
>>> print("Escrevendo os códigos dos caracteres em hexadecimal \x48\x45\x58 obtém-se a palavra HEX (código 48, 45 e 58)")
Escrevendo os códigos dos caracteres em hexadecimal HEX obtém-se a palavra HEX (código 48, 45 e 58)
Às vezes, queremos ignorar as sequências de escape dentro de uma string. Para fazer isso podemos colocar r ou R (raw) antes da string. Isto implicará que é uma sequência em bruto (raw) e que qualquer sequência de escape dentro dela será ignorada.
>>> print ("Este é \x75m\nbom exemplo")
Este é um
bom exemplo
>>> print (r"Este é \x75m\nbom exemplo")
Este é \x61m\nbom exemplo
O método format() para formatação de strings
Como já vimos, o método format() é muito versátil e poderoso na formatação de strings. As cadeias de formato contêm chaves {} como espaços reservados ou campos de substituição. Podemos usar argumentos posicionais ou argumentos de palavra-chave para especificar a ordem de substituição.
Exemplo:
# Ordem padrão (implícita)
ordem_padrao="{}, {} e {}".format("Paulo","Ana","Francisco")
print("--- Ordem Padrão ---")
print(ordem_padrao)
# Ordem posicional
ordem_posicional="{1}, {0} e {2}".format("Paulo","Ana","Francisco")
print("\n--- Ordem Posicional ---")
print(ordem_posicional)
# Ordem usando um identificador como argumento
ordem_identificador="{p}, {a} e {f}".format(a="Ana",p="Paulo",f="Francisco")
print("\n--- Ordem de palavras-chave ---")
print(ordem_identificador)
--- Ordem Padrão ---
Paulo, Ana e Francisco
--- Ordem Posicional ---
Ana, Paulo e Francisco
--- Ordem de palavras-chave ---
Paulo, Ana e Francisco
Como já vimos, o método format() pode ter especificações de formato opcionais. Estas são separadas do nome do campo usando dois pontos. Por exemplo, podemos justificar à esquerda <, justificar à direita > ou centrar ^ uma string no espaço dado. Também podemos formatar inteiros como binários, hexadecimais, etc. e os números float (reais) podem ser arredondados ou exibidos no formato de expoente.
Consulte aqui para toda a formatação de strings disponível com o método format().
Exemplos:
>>> "Representação binária de {0} é {0:b}".format(12)
'Representação binária de 12 é 1100'
>>> "Representação em expoente de {0} é {0:e}".format(1566.345)
'Representação em expoente de 1566.345 é 1.566345e+03'
>>> "Um terço é: {0:.3f}".format(1/3)
'Um terço é: 0.333'
>>> "|{:<10}|{:^10}|{:>10}|".format('manteiga','pão','presunto')
'|manteiga | pão | presunto|'
Métodos mais usados em strings no Python
Há vários métodos disponíveis com o objeto string. O método format() que mencionamos acima é um deles. Alguns dos métodos mais usados são lower(), upper(), join(), split(), find() e replace().
Consulte aqui uma lista completa de todos os métodos incorporados para trabalhar com strings em Python.
Exemplos de alguns métodos de strings (não dispensa a consulta da lista anterior):
>>> "PrOgRaMa".lower()
'programa'
>>> "PrOgRaMa".upper()
'PROGRAMA'
>>> "Isto dividirá todas as palavras numa lista".split()
['Isto', 'dividirá', 'todas', 'as', 'palavras', 'numa', 'lista']
>>> ' '.join(["Isto","concatenará","todas","as","palavras","numa","string","separadas","por","espaço"])
'Isto concatenará todas as palavras numa string separadas por espaço'
>>> "Feliz Ano Novo".replace("Feliz","Fantástico")
'Fantástico Ano Novo'
>>> float("10.5")+2.3 # Soma de um real contido numa string com 2.3
12.8
>>> int("2")+int("11",base=2) # Soma 2 com 3 (11 em binário)
5
>>> "python".capitalize()
'Python'
>>> "Python is awesome, isn't it?".count("is")
2
>>> "Python is easy to learn".endswith("learn")
True
>>> "Python is easy to learn".endswith("Python")
False
>>> "28212".isdigit()
True
>>> "Let it be, let it be, let it be".find("let")
11
>>> "Let it be, let it be, let it be".find("let",12)
22
>>> "Let it be, let it be, let it be".rfind("let")
22
>>> " Olá Paulo".lstrip()
'Olá Paulo'
>>> " Olá Paulo ".rstrip()
' Olá Paulo'