Skip to content
This page has been auto-translated and may contain errors.View in English

Strings

docs.scrimba.com

Texto aparece em quase todo programa que você escreve. Nomes, mensagens, pontuações, rótulos. Em Python, qualquer pedaço de texto é chamado de string: qualquer valor que você coloca entre aspas. Aspas simples ou duplas, ambas funcionam da mesma forma.

Strings são o tipo de texto principal do Python. Elas carregam tudo, desde um nome de usuário até um caminho de URL até saída formatada. Aspas simples e duplas produzem resultados idênticos; a escolha é estilística.

str fica em toda fronteira do sistema: I/O de terminal, conteúdo de arquivo, respostas de rede, dados serializados. É o tipo de sequência Unicode imutável do Python (inalterável após criação). Ambos os estilos de aspas produzem o mesmo objeto, então a escolha entre eles é puramente estilística.

python
greeting = "Hello, world"
username = 'joao'

A única vez que a escolha de aspas importa é quando seu texto contém marcas de aspas. Use o estilo oposto para não precisar escapá-las:

A convenção da comunidade é aspas duplas. A razão prática para mudar de estilo é evitar escape quando o conteúdo contém esse caractere:

A convenção é aspas duplas, e formatadores como Black e Ruff a aplicam automaticamente. A única razão para mudar manualmente é evitar uma barra invertida de escape quando o conteúdo contém o delimitador:

python
note = "It's a great day"      # apóstrofo dentro, use aspas duplas
message = 'She said "hello"'   # aspas duplas dentro, use aspas simples
escaped = "She said \"hello\""  # ou escape com uma barra invertida

Immutability

Strings são imutáveis: uma vez criada, você não pode alterá-la. Pense em uma string como permanentemente fixa no momento em que é criada. Qualquer operação que pareça modificar uma string está na verdade produzindo uma nova. A original permanece exatamente como era.

Strings são imutáveis: nenhum método modifica uma string no lugar. Toda operação que transforma texto retorna uma nova string e deixa a original intocada. A consequência prática é que uma chamada de método que você não atribui em lugar nenhum não tem efeito em nada.

Objetos str são imutáveis, significando que seu conteúdo é fixo uma vez criado e nada pode escrever neles. Isso dá às strings duas propriedades que você realmente usa: elas são hasháveis (um valor cujo conteúdo nunca muda pode ser arquivado por esse conteúdo, o que permite que uma string sirva como chave de dicionário ou membro de conjunto), e são seguras para passar entre nomes sem que ninguém as copie, já que ninguém pode alterar uma string compartilhada por você.

python
name = "joao"
name = name.upper()   # "JOAO" é uma nova string; "joao" não é alterada

A consequência direta: você não pode alterar um caractere em uma posição específica. Python levantará um erro se você tentar.

python
name = "joao"
name[0] = "J"   # TypeError: 'str' object does not support item assignment

Para obter uma string modificada, construa uma nova usando fatiamento ou um método. Ambos são cobertos abaixo.

Tentar atribuição de caractere mostra a restrição diretamente:

python
name = "joao"
name[0] = "J"   # TypeError: 'str' object does not support item assignment

Quando você precisa de uma versão modificada, as ferramentas padrão são fatiamento com concatenação para edições posicionais, e replace() para substituições. Ambas produzem uma nova string e deixam a original intocada.

Atribuir a uma posição (name[0] = "J") levanta TypeError toda vez, sem exceção. Para uma edição posicional, construa uma nova string fatiando ao redor da parte que você quer mudar: name[:1].upper() + name[1:] capitaliza o primeiro caractere. Para uma substituição em qualquer lugar da string, replace().

JunoImmutability Uma string nunca muda uma vez que existe. Qualquer coisa que pareça editá-la entrega uma nova string em vez disso, então atribua o resultado ou ele desaparece. O que me pegou no início: name[0] = "J" não funciona, levanta um TypeError.
JunoImmutability Nenhum método de string edita no lugar, cada um retorna uma nova string e deixa a original sozinha. Então name.upper() sozinho não faz nada útil, você tem que atribuir. E name[0] = "J" levanta TypeError, não há troca de caractere no lugar.
JunoImmutability Immutability é o que torna strings hasháveis, então funcionam como chaves dict, e são seguras para compartilhar sem copiar. Queda prática: atribua o resultado de todo método transformador, já que nenhum toca o original. Para uma edição posicional, fatiar ao redor do ponto e reconstruir, já que atribuição de item sempre levanta TypeError.

Indexing and slicing

Todo caractere em uma string tem uma posição numerada, começando em zero. Você pode ler caracteres individuais colocando esse número de posição entre colchetes. Números negativos contam para trás a partir do final.

Strings são sequências com indexação baseada em zero. Índices negativos contam a partir do final. Fatiamento extrai qualquer intervalo contíguo em uma única expressão, e nunca levanta um erro em valores fora do intervalo.

Uma string se comporta como uma sequência ordenada que você pode indexar e fatiar. Ler uma posição única (s[i]) levanta IndexError se o índice aponta para além do final. Fatiamento (s[start:stop:step]) se comporta diferentemente: limites fora do intervalo são silenciosamente fixados no que existe, então um fatiamento nunca pode levantar IndexError. Essa diferença é a prática a ser lembrada: acesso por índice é rígido, fatiamento é tolerante.

python
word = "Python"
#       012345

print(word[0])    # "P"
print(word[2])    # "t"
print(word[5])    # "n"
print(word[-1])   # "n"  (último caractere)
print(word[-2])   # "o"  (penúltimo)

-1 é sempre o último caractere, -2 o penúltimo, e assim por diante. Eles são úteis quando você quer o final de uma string sem conhecer seu comprimento exato.

Índices negativos envolvem: -1 é len(s) - 1, -2 é len(s) - 2. Mais útil para acesso ancorado no final quando você não quer calcular o comprimento manualmente. Um índice negativo que sai do intervalo ainda levanta IndexError, igual a um positivo.

Um índice negativo é convertido para len(s) + i antes da verificação de limites, então -1 pousa no último caractere e -2 no anterior. Sair do intervalo levanta IndexError de qualquer forma, positivo ou negativo: apenas fatiamento perdoa isso, indexação simples não.

Fatiamento extrai um pedaço. [start:stop] inclui start e exclui stop:

python
word = "Python"

print(word[0:2])   # "Py"     (posições 0 e 1)
print(word[2:])    # "thon"   (posição 2 até o final)
print(word[:3])    # "Pyt"    (início até a posição 2)
print(word[:])     # "Python" (cópia de toda a string)
print(word[::2])   # "Pto"    (cada segundo caractere)
print(word[::-1])  # "nohtyP" (invertida)

Três padrões principais: word[:n] para os primeiros n caracteres, word[n:] para tudo a partir da posição n em diante, word[-n:] para os últimos n caracteres. word[::-1] inverte uma string. Parece estranho na primeira vez, mas é Python idiomático e você verá frequentemente.

Diferentemente da indexação direta, fatiamento nunca levanta IndexError. Python fixa silenciosamente índices fora do intervalo, então word[100:] em uma string curta retorna "" em vez de quebrar. O argumento step controla o passo: word[::2] pega cada outro caractere, word[::-1] percorre em sentido inverso.

Em s[start:stop:step], qualquer parte que você deixa de fora padroniza para "o final natural para a direção que você está indo", não para um 0 e len() fixos. Com um passo positivo isso significa início-ao-fim; com um passo negativo inverte, então start se torna o último caractere e stop corre para a frente. É por isso que s[::-1] percorre toda a string em sentido inverso sem você escrever nenhum limite, e a mesma razão s[::-2] lhe dá cada segundo caractere para trás.

JunoIndexing and slicing Posições começam em zero, então word[0] é o primeiro caractere e word[-1] é o último. Um fatiamento pega um intervalo: word[start:stop] mantém start e para bem antes de stop. word[::-1] inverte a string, o que parece estranho na primeira vez e depois você o usa para sempre.
JunoIndexing and slicing Indexe a partir de zero, ou a partir do final com negativos, onde word[-1] é o último caractere. Fatia pegam um intervalo que inclui start e exclui stop, e um terceiro step define o passo, então word[::-1] inverte. A pegadinha a ser lembrada: indexar para além do final levanta IndexError, mas fatiamento para além retorna o que está lá em vez de falhar.
JunoIndexing and slicing Indexação simples é rígida e levanta IndexError fora do intervalo, fatiamento é tolerante e fixa-se ao que existe, então word[100:] retorna "" em vez de levantar. Deixe uma parte de fatiamento de fora e padroniza para o final natural para a direção do passo, que é toda a razão pela qual word[::-1] inverte sem limites escritos. Procure um fatiamento quando não gostaria de quebrar em uma entrada vazia ou curta.

Essential string methods

Strings vêm com um conjunto de métodos integrados: operações que você chama diretamente em qualquer valor de string. Você escreve a string (ou a variável que a contém), depois um ponto, depois o nome do método. Cada método retorna uma nova string. O original nunca é alterado.

Métodos de string são funções anexadas ao tipo str. Como strings são imutáveis, todo método retorna uma nova string em vez de modificar a original. Uma chamada de método que você não atribui ou passa para algum lugar não tem efeito duradouro.

Todo método transformador retorna uma nova str e deixa o original sozinho, o que segue direto da imutabilidade. Eles também funcionam em pontos de código (os próprios caracteres, não os bytes brutos usados para armazená-los), então métodos se comportam corretamente em texto acentuado e não-Latino sem você fazer nada especial. A compensação a ter em mente: cada método aloca uma nova string, então encadear muitos deles sobre texto grande significa muitas alocações.

Case

python
text = "Hello, World"

text.lower()       # "hello, world"
text.upper()       # "HELLO, WORLD"
text.title()       # "Hello, World"  (cada palavra capitalizada)
text.capitalize()  # "Hello, world"  (apenas a primeira palavra)

lower() e upper() são os dois que você mais usará. lower() é particularmente útil ao comparar texto: "Alice" e "alice" se tornam a mesma coisa uma vez que você chama .lower() em ambos os lados.

lower() é a etapa padrão de normalização antes de comparação ou armazenamento. title() capitaliza a primeira letra de cada palavra usando uma regra aproximada que falha em contrações: "it's" se torna "It'S". Trate-o como formatação apenas de exibição.

lower() aplica conversão de caso Unicode completa. Para comparação insensível a maiúsculas, casefold() é mais correto: aplica transformações adicionais (ex. ß alemão vira ss) que lower() pula. title() capitaliza após qualquer caractere não-alfanumérico, o que falha em contrações e nomes com hífen. Para título correto casing, implemente a lógica manualmente.

Whitespace

python
text = "  hello  "

text.strip()    # "hello"    (ambos os lados)
text.lstrip()   # "hello  "  (apenas esquerda)
text.rstrip()   # "  hello"  (apenas direita)

strip() remove espaços de ambas as extremidades de uma string. Você a usará quase sempre que lidar com entrada do usuário ou texto de um arquivo, porque espaços errantes causam falhas silenciosas: "joao" != "joao ".

strip() remove todo espaço em branco líder e à direita: espaços, abas e quebras de linha. As variantes direcionais deixam você limpar apenas um lado, útil para remover uma quebra de linha à direita sem tocar na indentação. Todos os três aceitam um argumento de caracteres opcional para remover caracteres específicos em vez disso.

Sem argumento, strip() remove todo tipo de espaço em branco de ambas as extremidades, incluindo espaço em branco não-ASCII, não apenas o espaço simples. Com um argumento de caractere remove qualquer um desses caracteres das extremidades, e essa é a pegadinha: o argumento é um conjunto de caracteres para remover, não um prefixo para combinar. "xxhelloxx".strip("x") retorna "hello", mas "https://".strip("https") não remove o prefixo "https", remove cada h, t, p e s de ambas as extremidades e retorna "://". Para remover um prefixo ou sufixo conhecido, use removeprefix() e removesuffix() em vez disso.

Finding

python
text = "Hello, world"

text.find("world")         # 7
text.find("Python")        # -1  (não encontrado)
text.count("l")            # 3
text.startswith("Hello")   # True
text.endswith("world")     # True

find() retorna a posição onde um pedaço de texto começa dentro de sua string. Se não estiver lá, retorna -1. Use startswith() e endswith() quando você apenas se importa se a string começa ou termina com algo específico.

find() retorna o índice inicial da primeira correspondência, ou -1. A convenção -1 deixa você usar o resultado diretamente em fatiamento ou aritmética sem uma verificação. startswith() e endswith() cada uma aceitam uma tupla de strings, então você pode testar vários prefixos ou sufixos em uma chamada.

find() examina da esquerda para a direita e retorna -1 quando não há correspondência. index() faz a mesma busca mas levanta ValueError em vez de retornar -1: escolha index() quando uma correspondência ausente significa que seu código tem um bug e você quer que pare lá, find() quando ausência é entrada normal que você verificará. Para uma pergunta pura "começa ou termina com isso", startswith() e endswith() dizem o que você quer dizer e param na primeira incompatibilidade, então prefira elas a uma verificação find() ou in para esse trabalho.

Replacing

python
text = "Hello, world"

text.replace("world", "Python")   # "Hello, Python"
text.replace("l", "L")            # "HeLLo, worLd"  (todas as ocorrências)
text.replace("l", "L", 1)         # "HeLlo, world"  (apenas a primeira)

replace() troca toda ocorrência de um pedaço de texto por outro e entrega uma nova string. O original não é alterado. Passe um terceiro argumento se você apenas quer substituir a primeira ocorrência.

replace() substitui todas as ocorrências não-sobrepostas por padrão. O argumento count limita quantas são substituídas. Como retorna uma nova string, chamadas podem ser encadeadas: text.replace("a", "A").replace("e", "E") aplica ambas as substituições em sequência.

replace() combina uma substring literal, não um padrão, então não faz regex e trata cada caractere no argumento como ele mesmo. Substitui correspondências não-sobrepostas da esquerda para a direita, o que pode surpreendê-lo: "aaa".replace("aa", "b")"ba", não "bb", porque a segunda aa sobrepõe a primeira correspondência. O argumento count limita quantas substitui, e como cada chamada retorna uma nova string você pode encadeá-las: text.replace(",", "").replace(" ", "_").

Splitting and joining

split() corta uma string em pedaços em um separador e retorna como uma lista. Você diz a ela o que cortar:

split() particiona em um separador e retorna os segmentos como uma lista. Chamado sem argumento, divide em qualquer executação de espaço em branco e descarta strings vazias de múltiplos espaços consecutivos:

split(sep) examina da esquerda-para-direita, dividindo em cada ocorrência não-sobreposta de sep. Sem argumento usa um algoritmo diferente: divide em qualquer executação de espaço em branco e remove espaço em branco líder e à direita do resultado. rsplit(sep, n) divide da direita, útil para isolar o último segmento de um caminho pontilhado ou identificador nomeado.

python
csv_row = "Joao,28,Brasilia"
parts = csv_row.split(",")     # ["Joao", "28", "Brasilia"]

"  hello   world  ".split()   # ["hello", "world"]

split() retorna uma lista, uma sequência ordenada de valores. Eles têm seu próprio capítulo Lists; por enquanto trate-os como a sequência de partes que split() produz e join() consome.

join() faz o inverso: combina uma lista de strings em uma. A string antes de .join() é colocada entre cada item:

python
words = ["Hello", "world"]

" ".join(words)    # "Hello world"
", ".join(words)   # "Hello, world"
"".join(words)     # "Helloworld"

O padrão a lembrar: separator.join(list_of_strings). O separador fica à esquerda, a lista à direita. " ".join(words) coloca um espaço entre cada palavra. "".join(words) as cola com nada entre.

join() é a ferramenta certa sempre que você está montando uma única string de múltiplos pedaços. Realiza uma única alocação em vez de criar uma nova string a cada passo. Para duas ou três strings, + é perfeitamente fino. Uma vez que você tem uma lista de qualquer tamanho significativo, procure por join().

join() percorre os pedaços uma vez, calcula o tamanho total, aloca o resultado uma única vez, e escreve tudo. Construir a mesma string com + repetido em um loop é a forma cara: porque strings não podem mudar, cada + aloca uma string fresca e copia tudo até agora, então o custo cresce com o quadrado do número de pedaços. Em um punhado de strings ninguém nota, mas em alguns milhares vira uma operação rápida lenta. A regra que a impede: colete os pedaços em uma lista e join() uma vez ao final, nunca += uma string em um loop.

JunoEssential string methods Cada um desses retorna uma nova string, então atribua o resultado ou está sumido. O punhado que você procurará diariamente: .lower() e .upper() para caso, .strip() para aparar espaços errantes, .find() para localizar texto (retorna -1 quando não está lá), .replace() para trocar texto, e .split() com sep.join() para desconstruir uma string e reconstruir.
JunoEssential string methods Todos esses retornam uma nova string, nenhum muta, então encadeie ou atribua. Mantenha as pegadinhas retas: .strip("x") leva um conjunto de caracteres para aparar, não um prefixo, e .split() sem argumento colapsa executações de espaço em branco. Para montar muitos pedaços, construa uma lista e sep.join() ela.
JunoEssential string methods As duas pegadinhas que mordem em código real: .strip(chars) remove um conjunto de caracteres das extremidades, não um prefixo, então use removeprefix() quando você quer dizer um prefixo, e construir uma string com += em um loop é a forma lenta, então colete em uma lista e join() uma vez. Para comparação, normalize com .casefold() sobre .lower(), e trate .title() como apenas exibição já que estraga contrações.

f-strings

f-strings embutem valores diretamente dentro do texto. Coloque f antes da aspas de abertura, depois envolva qualquer variável ou expressão em chaves. Python a preenche quando o código roda. Você também pode adicionar dois-pontos após o valor para controlar como é exibido.

f-strings avaliam qualquer expressão dentro de {} em tempo de execução e convertem o resultado em uma string. Um dois-pontos dentro das chaves introduz uma especificação de formato: uma sintaxe compacta para controlar casas decimais, alinhamento e formatação de números.

Cada {} em uma f-string acaba chamando o próprio método __format__ do valor (um dunder, o método de duplo-sublinhado que Python chama por trás dos panos quando formata um valor), passando junto o que você escreveu após o dois-pontos. Então qualquer classe que você escreva pode decidir como aparece dentro de uma f-string definindo __format__. Os sinalizadores de conversão !r, !s, e !a rodam repr(), str(), ou ascii() no valor primeiro; !r é o a se manter, porque mostra um valor da forma que você o digitaria em código, aspas e escapes inclusos, que é mostrado na prática abaixo.

python
name = "Joao"
score = 94.5

print(f"Hello, {name}!")           # "Hello, Joao!"
print(f"Score: {score:.1f}%")      # "Score: 94.5%"
print(f"2 + 2 = {2 + 2}")          # "2 + 2 = 4"
print(f"Name: {name.upper()}")     # "Name: JOAO"

A especificação de formato após : controla como o valor é exibido:

SpecMeaningExample
.2f2 casas decimaisf"{3.14159:.2f}""3.14"
.0%percentual, sem decimaisf"{0.94:.0%}""94%"
,separador de milharesf"{1000000:,}""1,000,000"
>10alinhar à direita em 10 charsf"{'oi':>10}"" oi"

Você usará .2f mais: sempre que exibir um decimal e quiser um número arrumado em vez de uma longa série de dígitos. Tudo mais na tabela está lá quando você precisa. Você pode colocar qualquer variável, aritmética, ou chamada de método dentro de {}.

.2f e .0% cobrem a maioria da formatação de exibição. Os especificadores de alinhamento (>, <, ^) produzem saída tabular quando combinados com uma largura. O padrão geral é {value:[align][width][.precision][type]}. Uma vez que você reconheça as peças, qualquer especificação é legível sem memorizar todas as combinações.

O mesmo spec pode significar coisas diferentes para tipos diferentes, porque cada tipo se formata: f"{'oi':5}" estofada texto à direita enquanto f"{42:5}" estofada um número à esquerda, mesmo :5, resultado oposto. O sinalizador de conversão vale um hábito é !r: roda repr() antes da formatação, que envolve strings em aspas e transforma caracteres invisíveis (abas, espaços à direita, quebras de linha) em sequências de escape visíveis. Quando a saída parece sutilmente errada, trocar {value} por {value!r} é a forma mais rápida de ver o que realmente está lá.

Junof-strings Coloque f antes da aspas de abertura, depois envolva qualquer variável, soma, ou chamada de método em {} e Python deixa o resultado cair quando a linha roda. Um dois-pontos dentro das chaves controla a aparência: :.2f para duas casas decimais é aquele em que você vai se inclinar. Muito mais arrumado que colar texto junto com +.
Junof-stringsf"..." avalia qualquer expressão em {} e deixa o resultado cair direto, sem str() necessário. Após um dois-pontos vem a especificação de formato: :.2f, :,, :>10 e amigos, todos seguindo {value:[align][width][.precision][type]}. Aprenda as peças uma vez e você pode ler qualquer especificação sem memorizá-las.
Junof-strings Cada {} chama o próprio __format__ do valor, então a especificação após o dois-pontos significa o que esse tipo decide, que é por que :5 estofada texto e números em direções opostas. O sinalizador a se manter é !r: mostra um valor da forma que você o digitaria, então espaço em branco errante e outro lixo invisível salta no momento em que a saída parece desligada.

Multiline strings

Para escrever uma string que abrange mais de uma linha, use aspas triplas: três " no início e três no final. Python preserva todas as quebras de linha e espaçamento exatamente como você os escreveu.

Strings entre aspas triplas preservam todo espaço em branco e quebras de linha literalmente. Elas são padrão para blocos de texto longo como modelos de email e consultas SQL, e para docstrings: a documentação integrada colocada no início de um corpo de função ou classe.

Uma string entre aspas triplas mantém cada caractere exatamente, incluindo os espaços à esquerda em cada linha, que é a pegadinha: indente o literal para combinar com seu código e essa indentação chega dentro do texto. Quando é a primeira declaração em uma função, classe, ou módulo, Python a mantém como a docstring desse objeto (a documentação que help() mostra para ela), então a convenção é colocar um resumo curto lá. Para indentar um bloco entre aspas triplas para combinar com seus arredores sem a indentação vazar para o valor, remova-a em tempo de execução com textwrap.dedent(). Triplo ''' e """ funcionam o mesmo; """ é a convenção.

python
message = """
Dear Joao,

Thank you for your order.

Best regards,
The Team
"""
JunoMultiline strings Três marcas de aspas em cada final deixam uma string rodar por várias linhas, e Python mantém cada quebra de linha e espaço exatamente como você os digitou. Procure por elas sempre que você tiver um bloco de texto, como uma mensagem ou um modelo, que não cabe confortavelmente em uma linha.
JunoMultiline strings Aspas triplas preservam quebras de linha e espaçamento verbatim, então elas são adequadas para modelos de email, SQL, e qualquer bloco longo. Elas também são como docstrings funcionam: uma string entre aspas triplas no topo de uma função ou classe se torna sua documentação integrada. Observe a indentação, já que os espaços que você adiciona para alinhá-la terminam dentro do texto.
JunoMultiline strings Tudo dentro de aspas triplas é mantido literalmente, espaço em branco à esquerda incluído, que é a pegadinha: indente o literal para combinar com seu código e esse indent chega no valor. Coloque um curto no topo de uma função ou classe e se torna a docstring que help() mostra. Quando você precisa indentado na fonte mas limpo no valor, execute por textwrap.dedent().

Escape sequences

Alguns caracteres são difíceis de digitar diretamente dentro de uma string. Python usa sequências de escape: uma barra invertida seguida por uma letra que significa algo. Os dois que você usará constantemente são \n para uma nova linha e \t para uma aba.

Sequências de escape deixam você incorporar caracteres que de outra forma quebrariam a sintaxe ou não podem ser digitados diretamente. Os que você procurará: \n (nova linha), \t (aba), \\ (uma barra invertida literal), \" e \' (aspas dentro de uma string com delimitador correspondente). Caminhos do Windows requerem barras invertidas, que colidem com processamento de escape. Prefixo com r para desabilitá-lo.

Além do \n e \t cotidianos, Python suporta escapes Unicode para caracteres que você não pode digitar diretamente: \uXXXX e \UXXXXXXXX nomeiam um caractere pelo seu número, e \N{name} o nomeia em palavras, como \N{GREEK SMALL LETTER ALPHA}. O para procurar em código real é a string bruta, escrita r"...", que desativa o tratamento de escape inteiramente e passa cada barra invertida inalterada. Use para caminhos do Windows e para padrões de expressão regular, onde as barras invertidas são significadas para esse consumidor em vez de para Python, e onde esquecer r produz padrões que silenciosamente combinam a coisa errada.

SequenceCharacter
\nNova linha
\tAba
\\Barra invertida literal
\"Aspas duplas
\'Aspas simples
python
print("Line one\nLine two")        # duas linhas de saída
print("Name:\tJoao")              # Name:   Joao
path = r"C:\Users\Joao\Documents" # string bruta, sem processamento de escape
JunoEscape sequences Uma barra invertida dentro de uma string significa "ler o próximo caractere especialmente": \n inicia uma nova linha, \t insere uma aba, \\ é uma barra invertida real. Esses dois, \n e \t, são aqueles que você realmente digitará. Coloque um r antes da aspas e barras invertidas voltam a ser simples, útil para caminhos do Windows.
JunoEscape sequences\n, \t, \\, e \" cobrem os escapes cotidianos. O que economiza dores de cabeça: uma string bruta, r"...", desativa o processamento de escape então cada barra invertida permanece literal. Use para caminhos do Windows e padrões regex, onde as barras invertidas significam algo outro que não Python.
JunoEscape sequences Passado \n e \t existem escapes Unicode como \N{name}, mas a besta de carga é a string bruta r"...", que passa cada barra invertida inalterada. Procure por padrões regex e caminhos do Windows, já que esquecer dá um padrão que silenciosamente combina a coisa errada em vez de um erro que diz a você.

Checking string contents

Python tem métodos que respondem perguntas sim/não sobre o que uma string contém. Eles retornam True ou False. O mais útil no início: isdigit() permite você verificar se uma string é todos os números antes de convertê-la, então você pode evitar uma queda em entrada inesperada.

Os métodos is* cada um testam uma propriedade específica da string inteira e retornam True apenas se cada caractere satisfaz a condição. Seu uso principal é validação de entrada: verificar antes de converter para evitar uma queda em entrada inesperada. isdigit() antes de int() é o padrão clássico, uma alternativa para capturar o ValueError coberto no capítulo Files and exceptions.

Essas verificações perguntam "é cada caractere desse tipo" através de todo Unicode, não apenas as letras e dígitos ASCII simples. Isso significa "2".isdigit() é True para o sobrescrito dois bem como o "2" comum, que pode deixar entrada surpreendente escorregar por uma verificação de validação. Quando você quer estritamente os dígitos 0 a 9, combine s.isascii() and s.isdigit(). isnumeric() é ainda mais amplo, contando frações e outros caracteres com valor numérico, então procure pela verificação mais estreita que combina o que você realmente aceita em vez da primeira que parece certa.

python
"42".isdigit()       # True
"hello".isalpha()    # True
"hello42".isalnum()  # True
"   ".isspace()      # True
"Hello".islower()    # False
"HELLO".isupper()    # True
JunoChecking string contents Os métodos is* respondem perguntas sim-ou-não e retornam True apenas quando cada caractere se encaixa. O que você usará primeiro: chame isdigit() antes de int() para se certificar que o texto realmente é um número, então entrada estranha não o quebra.
JunoChecking string contents Cada método is* é True apenas se toda a string passar, que os torna úteis para validar entrada antes de converter. isdigit() antes de int() é a guarda clássica. Lembre que está testando a string inteira, então uma string vazia retorna False para todos eles.
JunoChecking string contents Essas verificações abrangem todo Unicode, não ASCII simples, então isdigit() passa sobrescritos e outros caracteres numéricos que você não quis aceitar. Quando você quer os dígitos 0 a 9, emparelhe: s.isascii() and s.isdigit(). Escolha a verificação mais estreita que combina sua entrada real em vez da primeira que parece próxima.

In practice

Remova espaço em branco, normalize caso, depois puxe o que você precisa. Essa sequência lida com quase qualquer texto fornecido pelo usuário:

python
raw_input = "  Joao@Example.COM  "
email = raw_input.strip().lower()   # "joao@example.com"

at_pos = email.find("@")
username = email[:at_pos]
domain = email[at_pos + 1:]

print(f"User:   {username}")    # "joao"
print(f"Domain: {domain}")      # "example.com"

Construindo uma URL de partes e imediatamente validando e analisando:

python
BASE_URL = "https://api.example.com"
version = "v2"
resource = "users"
user_id = 42

url = f"{BASE_URL}/{version}/{resource}/{user_id}"
# "https://api.example.com/v2/users/42"

parts = url.split("://")              # ["https", "api.example.com/v2/users/42"]
protocol = parts[0]                   # "https"
secured = url.startswith("https")
domain = parts[1].split("/")[0]       # "api.example.com"

print(f"Protocol : {protocol}")
print(f"Secure   : {secured}")
print(f"Domain   : {domain}")

Analisando uma linha de log estruturada usando find(), fatiamento, e alinhamento de f-string:

python
log_entry = "[2024-01-15 09:42:11] ERROR: File not found: report.csv"

timestamp = log_entry[1:20]
rest = log_entry[22:]                # "ERROR: File not found: report.csv"
colon_pos = rest.find(":")
level = rest[:colon_pos]             # "ERROR"
message = rest[colon_pos + 2:]       # "File not found: report.csv"

print(f"[{timestamp}] {level:>8}: {message}")
# [2024-01-15 09:42:11]    ERROR: File not found: report.csv

find() localiza o limite, fatiamento extrai as partes, e a especificação de formato >8 alinha à direita o rótulo de severidade então colunas permanecem consistentes quando nomes de nível diferem em comprimento.

Method reference

MethodWhat it does
.lower() / .upper()Converter para minúsculas / MAIÚSCULAS
.title() / .capitalize()Capitalizar cada palavra / apenas a primeira
.strip() / .lstrip() / .rstrip()Remover espaço em branco circundante
.find(sub)Índice da primeira correspondência, ou -1
.count(sub)Quantas vezes sub aparece
.startswith(s) / .endswith(s)Verificação de prefixo / sufixo
.replace(old, new)Substituir ocorrências
.split(sep)Dividir em uma lista
sep.join(iterable)Juntar itens em uma string
.isdigit() / .isalpha() / .isalnum()Verificações de tipo de caractere