Strings são sequências, de forma que podem ser utilizados índices para operar com partes da sequência.
Em Python, ums string como "Olá, João" pode ser representada como na imagem abaixo:
Note que há duas indexações possíveis, uma positiva iniciando em 0 (zero) e outra negativa iniciando em -1.
O uso de colchetes []
possibilita operar com partes da string, como exemplificado a seguir.
# Atribuir uma string à variável s
s = 'Olá meu caro João, hoje é segunda.'
# Pegar a primeira letra (índice 0)
s[0]
# Pegar a terceira letra (índice 2)
s[2]
# Pegar a última letra (índice -1)
s[-1]
# Pegar a penúltima letra (índice -2)
s[-2]
Dentro dos colchetes pode ser utilizado o caracter :
para definir pedaços da string. Por exemplo:
# Pegar o pedaço que inicia no índice 2 e estende-se até o índice 6
s = "Olá, João"
s[2:7]
Note que o intervalo foi escrito como [2:7]
porque em Python o intervalo é fechado no primeiro elemento mas aberto no segundo, ou seja define os índices: 2, 3, 4, 5 e 6.
Note, também, que ao pegar uma letra ou um pedaço de uma string, a string original não é alterada (é imutável)
# Pegar tudo a partir do índice 2
s[2:]
# Pegar tudo do início até o índice 6 (exclusivo)
s[:6]
# Pegar tudo do início até a penúltima letra
s[:-1]
# Pegar tudo do início ao fim, mas com passo 2, ou seja, somente os índices pares
s[::2]
# Pegar tudo do início ao fim, mas invertido (com passo -1)
s[::-1]
O comando 'for' pode ser utilizado para percorrer toda uma string ou parte dela, conforme exemplificado abaixo:
# Percorrer toda a string, caracter a caracter
s = 'Olá, João'
for letra in s:
print(letra * 5)
# Percorrer um pedaço da string (tudo exceto as duas últimas letras)
for letra in s[:-2]:
print(letra)
Em Python há o operador in que permite verificar se um elemento pertence a uma sequência.
# Verificar se uma determinada letra está na string
frase = "João e Maria"
'Mar' in frase
# Verificar se uma palavra NÃO está na string
if 'José' not in frase:
print("José não está na frase")
Em Python strings são objetos, os quais são exemplares da class "str". Nesta classe são definidos métodos (ações) que podem ser executadas por strings, os quais assumem a forma geral:
object.método(parâmetros)
Abaixo estão alguns exemplos de métodos sobre strings:
s = "Olá, João Carlos"
type(s)
# Obter uma nova string que é cópia da anterior porém com todas as letras transformadas para maiúsculas
print(s.upper())
print(s)
# Note que é gerada uma nova string, sendo que a original não é alterada
# Obter uma nova string em letras minúsculas
s.lower()
# Dividir uma string em pedaços (por padrão o critério de divisão é caracter em branco)
s.split()
# Dividir uma string em pedaços, utilizando o caracter ',' como critério de divisão
s.split(',')
# Contar o número de ocorrências de uma letra
s.count('O')
# Contar o número de ocorrências não sobrepostas
frase = "O carro atropelou o carcará"
frase.count('car')
# Contar o número de ocorrências não sobrepostas de uma posição até outra
frase.count('car', 8, 24)
# Localizar uma substring: retorna o índice
frase.index('car')
# Remover caracteres no início e no final de uma string
# Por padrão são removidos espaços em branco
palavra = " Hoje é dia de festa "
palavra.strip()
# Remover caracteres no início e no final de uma string
palavra.strip('H a')
# Substituir uma string por outra
frase.replace('car', 'zzz')
# Substituir uma string por string vazia (equivale a excluir)
frase.replace('car', '')
# Lembrar que é gerada uma nova string e que a original não é alterada (imutável)
# Verifica se todos os caracteres da string são dígitos numéricos
str = "123456";
print(str.isdigit())
# Verifica se todos os caracteres da string são letras
str = "Abracadabra";
print(str.isalpha())
# Verifica se todos os caracteres da string são dígitos numéricos ou letras
str = "Abc123";
print(str.isalnum())
Há diversos outros métodos definidos na classe 'str' que não estão descritos aqui. Para conhecê-los, veja a documentação da classe 'str'.
# Verificar se duas strings são iguais
"João" == "Joao"
# Verificar se duas strings são diferentes
"João Carlos" != "José Carlos"
# Comparar duas strings desconsiderando a diferença entre letras maiúsculas e minúsculas
p1 = 'Cachorro'
p2 = 'cachorro'
# A comparação falha uma vez que as duas strings não são iguais (diferem na primeira letra)
p1 == p2
# Comparar as duas strings após convertê-las para letras maiúsculas
p1.upper() == p2.upper()
Note que os sinais diacríticos (acento agudo, acento circunflexo, til, etc) impactam no resultado da comparação de strings.
Os nomes "Antonio" e "Antônio", por exemplo, são diferentes uma vez o valor decimal correspondente ao caracter 'o' difere do valor do caracter 'ô'
# Valor numérico do caracter 'o'
ord('o')
111
# Valor numérico do caracter 'ô'
ord('ô')
244
# As duas strings abaixo são diferentes
"Antonio" != "Antônio"
Em ordem lexicográfica (ordem alfabética) o nome "Maria das Dores" vem antes do nome "Maria do Rosário"
# Verificar quem vem antes em ordem lexicográfica (ordem alfabética)
"Maria das Dores" < "Maria do Rosário"
De forma similar, o nome "João" deveria vir antes do nome "José". Contudo, esta comparação falha uma vez que o valor decimal do caracter 'ã' é maior que o valor do caracter 's'
# Valor numérico do caracter 'ã'
ord('ã')
# Valor numérico do caracter 's'
ord('s')
# A expressão abaixo falha
"João Carlos" < "José Carlos"
# Inverter o sobrenome com o nome (padrão de listas de telefones)
# "João Carlos de Oliveira" => "Oliveira, João Carlos de"
nome = "João Carlos de Oliveira"
ind = nome.rindex(' ') # encontra o índice do último espaço em branco (antes de Oliveira)
sobrenome = nome[ind+1:] # separa o sobrenome (após o último branco até o final)
primeiro_nome = nome[:ind] # separa o nome (do início até o caracter anterior ao último espaço em branco)
nome_lista_telefonica = sobrenome + ", " + primeiro_nome # concatena as partes, invertendo a ordem
print(nome_lista_telefonica)
# Verifica se um string lido representa um número binário (formado apenas por dígitos 0 ou 1)
# "101100" => True
# "11031" => False
numero = input() # lê o número (supostamente binário) na forma de um string
eh_binario = True # Supõe, por hipótese, que trata-se de um número binário.
# Em seguida tenta refutar a hipótese, ou seja, procurar um caracter que não seja um dígito binário
for caracter in numero: # percorre os caracteres do número, um a um
if caracter != '0' and caracter != '1': # Testa a condição que refuta a hipótese inicial, ou seja,
# verifica se o caracter não é um dígito binário
eh_binario = False # Nega a hipótese inicial
break # Para o processo de repetiçao "for" uma vez que não é necessário testar os demais caracteres
print(eh_binario)
# Uma segunda forma de resolver o problema anterior é contar quantas vezes aparecem os caracteres '0' e '1' no número
# e comparar a soma das contagens com o total de caracteres. Se forem iguais, então o número é binário
numero = input() # lê o número (supostamente binário) na forma de um string
eh_binario = numero.count('0') + numero.count('1') == len(numero)
print(eh_binario)
# Verificar se uma frase é palíndromo (lida igual de trás para frente)
frase = "Socorram-me, subi no onibus em marrocos."
frase_limpa = '' # armazena apenas as letras; os demais caracteres são descartados
for caracter in frase.lower(): # percorre a frase caracter a caracter, já toda em letras minúsculas
if caracter.isalpha(): # se o caracter for uma letra, concatena na frase limpa
frase_limpa += caracter
print(frase_limpa == frase_limpa[::-1]) # compara a frase com ela invertida para ver se são iguais
# Verificar se as letras de um string estão todas em ordem crescente
# "adffgz" => True
# "dgahbz" => False
# A estratégia adotada é a de percorrer as letras uma a uma a partir da segunda
# e comparar cada letra com a anterior para ver se elas estão na ordem correta
sequencia = input() # lê a sequência de letras
esta_ordenada = True # supõe, por hipótese, que as letras estão ordenadas e em seguida tenta refutar esta hipótese
for i in range(1, len(sequencia)): # a variável i será utilizada para indexar cada letra, começando na segunda
if sequencia[i] < sequencia[i-1]: # compara uma letra (índice i) com sua anterior (índice i-1)
# se a condição é verdadeira significa que não está na ordem e, portanto,
# a hipótese inicial é falsa
esta_ordenada = False # refuta a hipótese inicial
break # para o processo pois não é necessário continuar a verificação