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

Strings

Texto aparece em quase todos os programas que você escreve. Nomes, mensagens, pontuações, rótulos. Em Python, qualquer pedaço de texto é chamado de string: qualquer valor que você envolve em 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é uma saída formatada. Aspas simples e duplas produzem resultados idênticos; a escolha é estilística.

str fica em toda fronteira do sistema: entrada/saída do terminal, conteúdo de arquivos, respostas de rede, dados serializados. É o tipo de sequência Unicode imutável do Python (inalterável após a 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 = 'alice'

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

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

A convenção é aspas duplas, e formatadores como Black e Ruff a impõem automaticamente. O único motivo para trocar manualmente é evitar uma barra invertida 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

Imutabilidade

Strings são imutáveis: uma vez que você cria uma, não pode mudá-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 completamente 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 intacta. A consequência prática é que uma chamada de método que você não atribui a nada não tem efeito em nada.

Objetos str são imutáveis, o que significa 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 hashable (um valor cujo conteúdo nunca muda pode ser arquivado por seu conteúdo, o que permite que uma string sirva como chave de dicionário ou membro de conjunto), e é seguro passá-las entre nomes sem que ninguém as copie, já que ninguém pode mudar uma string compartilhada por baixo de você.

python
name = "alice"
name = name.upper()   # "ALICE" é uma nova string; "alice" fica inalterada

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

python
name = "alice"
name[0] = "A"   # 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 limitação diretamente:

python
name = "alice"
name[0] = "A"   # 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. Ambos produzem uma nova string e deixam a original intacta.

Atribuir a uma posição (name[0] = "A") lança TypeError todas as vezes, 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().

JunoImutabilidade Uma string nunca muda uma vez que existe. Qualquer coisa que pareça editá-la lhe devolve uma nova string em vez disso, então atribua o resultado ou ele desaparece. Aquela que pegou muita gente no início: name[0] = "A" não funciona, lança um TypeError.
JunoImutabilidade Nenhum método de string edita no lugar, todo 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] = "A" lança TypeError, não há troca de caractere no lugar.
JunoImutabilidade A imutabilidade é o que torna strings hashable, então funcionam como chaves de dicionário, e é seguro compartilhá-las sem copiar. Efeito prático: atribua o resultado de todo método que transforma, já que nenhum toca o original. Para uma edição posicional, fatie ao redor do local e reconstrua, já que atribuição de item sempre lança TypeError.

Indexação e fatiamento

Todo caractere em uma string tem uma posição numerada, começando no zero. Você pode ler caracteres individuais colocando aquele 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 lança 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]) lança IndexError se o índice apontar além do final. Fatiamento (s[start:stop:step]) se comporta diferentemente: limites fora do intervalo são silenciosamente fixados ao que existe, então um fatiamento nunca pode lançar IndexError. Essa diferença é a prática para manter: 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. São úteis quando você quer o final de uma string sem saber seu comprimento exato.

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

Um índice negativo é convertido para len(s) + i antes da verificação de limites, então -1 cai no último caractere e -2 no anterior. Sair do intervalo lança 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é posição 2)
print(word[:])     # "Python" (uma cópia de toda a string)
print(word[::2])   # "Pto"    (cada segundo caractere)
print(word[::-1])  # "nohtyP" (invertida)

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

Diferente da indexação direta, fatiamento nunca lança IndexError. Python limita índices fora do intervalo silenciosamente, então word[100:] em uma string curta retorna "" em vez de travar. O argumento step controla o passo: word[::2] pega cada outro caractere, word[::-1] percorre ao contrário.

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

JunoIndexação e fatiamento Posições começam no 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 logo antes de stop. word[::-1] inverte a string, o que parece estranho na primeira vez e depois você usa para sempre.
JunoIndexação e fatiamento Indexe a partir do zero, ou a partir do final com negativos, onde word[-1] é o último caractere. Fatias pegam um intervalo que inclui start e exclui stop, e um terceiro step define o passo, então word[::-1] inverte. A pegadinha a lembrar: indexar além do final lança IndexError, mas fatiamento além retorna o que está lá em vez de falhar.
JunoIndexação e fatiamento Indexação simples é rígida e lança IndexError fora do intervalo, fatiamento é tolerante e limita ao que existe, então word[100:] retorna "" em vez de lançar. Deixe uma parte de fatia de fora e ela padrão para o final natural para a direção do passo, que é toda a razão word[::-1] inverte sem limites escritos. Prefira um fatia quando você não gostaria de travar em uma entrada vazia ou curta.

Métodos essenciais de string

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. A original nunca é alterada.

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 em algum lugar não tem efeito duradouro.

Todo método que transforma retorna uma nova str e deixa a original sozinha, o que segue direto da imutabilidade. Eles também funcionam em code points (os caracteres em si, 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. O trade-off a manter em mente: cada método aloca uma nova string, então encadear muitos deles sobre texto grande significa muitas alocações.

Maiúsculas e minúsculas

python
text = "Hello, World"

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

lower() e upper() são os dois que você vai usar mais. lower() é particularmente útil ao comparar texto: "Alice" e "alice" ficam iguais uma vez que você chama .lower() em ambos os lados.

lower() é o passo de normalização padrã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" fica "It'S". Trate-o como formatação apenas para exibição.

lower() aplica conversão de caso Unicode completa. Para comparação case-insensitive, casefold() é mais correto: aplica transformações adicionais (por exemplo, alemão ß vira ss) que lower() pula. title() capitaliza após qualquer caractere não-alfanumérico, o que destrói contrações e nomes hifenizados. Para title casing correto, implemente a lógica manualmente.

Espaço em branco

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ê vai usá-lo quase sempre que lidar com entrada do usuário ou texto de um arquivo, porque espaços perdidos causam falhas silenciosas: "alice" != "alice ".

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 indentação. Todas as 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.

Localização

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 está lá, retorna -1. Use startswith() e endswith() quando você só 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() escaneia da esquerda para a direita e retorna -1 quando não há correspondência. index() faz a mesma busca mas lança ValueError em vez de retornar -1: escolha index() quando uma correspondência perdida significa seu código tem um bug e você quer que pare lá, find() quando ausência é entrada normal que você vai verificar. Para uma pura questão "começa ou termina com isso", startswith() e endswith() dizem o que você quer e param na primeira incompatibilidade, então prefira-os sobre uma verificação find() ou in para esse trabalho.

Substituição

python
text = "Hello, world"

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

replace() troca toda ocorrência de um pedaço de texto por outro e lhe devolve uma nova string. A original não é alterada. Passe um terceiro argumento se você só quer substituir a primeira ocorrência.

replace() substitui todas as ocorrências não-sobrepostas por padrão. O argumento count limita quantos são substituídos. Como retorna uma nova string, chamadas podem ser encadeadas: text.replace("a", "A").replace("e", "E") aplica ambas 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 surpreeendê-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 toda chamada retorna uma nova string você pode encadeá-las: text.replace(",", "").replace(" ", "_").

Dividindo e juntando

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

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

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

python
csv_row = "Alice,28,São Paulo"
parts = csv_row.split(",")     # ["Alice", "28", "São Paulo"]

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

split() retorna uma lista, uma sequência ordenada de valores. Eles ganham 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 vai à esquerda, a lista à direita. " ".join(words) coloca um espaço entre cada palavra. "".join(words) cola-os com nada entre.

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

join() caminha pelos pedaços uma vez, trabalha o tamanho total, aloca o resultado uma única vez, e escreve tudo. Construir a mesma string com + repetido em um loop é a forma cara: como strings não podem mudar, cada + aloca uma string fresca e copia tudo até agora nela, 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 transforma uma operação rápida em lenta. A regra que previne: coleta os pedaços em uma lista e join() uma vez no final, nunca += uma string em um loop.

JunoMétodos essenciais de string Todo um desses retorna uma nova string, então atribua o resultado ou desaparece. O punhado que você vai usar diariamente: .lower() e .upper() para maiúsculas/minúsculas, .strip() para aparar espaços perdidos, .find() para localizar texto (retorna -1 quando não está lá), .replace() para trocar texto, e .split() com sep.join() para separar uma string e montá-la de novo.
JunoMétodos essenciais de string Todos esses retornam uma nova string, nenhum muta, então encadeie-os ou atribua-os. Mantenha as pegadinhas claras: .strip("x") pega um conjunto de caracteres para aparar, não um prefixo, e .split() sem argumento colapsa execuções de espaço em branco. Para montar muitos pedaços, construa uma lista e sep.join() dela.
JunoMétodos essenciais de string 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 coleta em uma lista e join() uma vez. Para comparação, normalize com .casefold() sobre .lower(), e trate .title() como apenas para exibição já que estraga contrações.

f-strings

f-strings embutem valores diretamente dentro de 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 depois do valor para controlar como ele é exibido.

f-strings avaliam qualquer expressão dentro de {} em tempo de execução e convertem o resultado para uma string. Dois-pontos dentro das chaves introduzem uma especificação de formato: uma sintaxe compacta para controlar casas decimais, alinhamento e formatação numérica.

Cada {} em uma f-string termina chamando o método __format__ do valor (um dunder, o método de duplo-underscore que Python chama nos bastidores quando formata um valor), passando qualquer coisa que você escreveu depois dos dois-pontos. Então qualquer classe que você escreve pode decidir como aparece dentro de uma f-string definindo __format__. Os sinalizadores de conversão !r, !s, e !a executam repr(), str(), ou ascii() no valor primeiro; !r é aquele para manter, porque mostra um valor do jeito que você digitaria em código, aspas e escapes inclusos, que é mostrado na prática abaixo.

python
name = "Alice"
score = 94.5

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

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

SpecSignificadoExemplo
.2f2 casas decimaisf"{3.14159:.2f}""3.14"
.0%percentual, sem decimaisf"{0.94:.0%}""94%"
,separador de milharesf"{1000000:,}""1.000.000"
>10alinhado à direita em 10 caracteresf"{'hi':>10}"" hi"

Você vai usar .2f na maioria das vezes: toda vez que exibe um decimal e quer um número arrumado em vez de um longo fluxo de dígitos. Tudo o mais na tabela está lá quando você precisa. Você pode colocar qualquer variável, aritmética ou chamada de método dentro do {}.

.2f e .0% cobrem a maioria de 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 os pedaços, qualquer especificação é legível sem memorizar todas combinações.

A mesma especificação pode significar coisas diferentes para tipos diferentes, porque cada tipo formata a si mesmo: f"{'hi':5}" preenchimento texto à direita enquanto f"{42:5}" preenchimento um número à esquerda, mesmo :5, resultado oposto. O sinalizador de conversão a manter como hábito é !r: executa repr() antes de formatar, 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 saída parece sutilmente errada, trocar {value} por {value!r} é a forma mais rápida de ver o que está realmente lá.

Junof-strings Coloque f antes da aspas de abertura, depois envolva qualquer variável, soma ou chamada de método em {} e Python coloca o resultado quando a linha roda. Dois-pontos dentro das chaves controlam a aparência: :.2f por duas casas decimais é aquele em que você vai confiar. Muito mais arrumado que colar texto junto com +.
Junof-stringsf"..." avalia qualquer expressão em {} e coloca o resultado direto, sem str() necessária. Depois de dois-pontos vem a especificação de formato: :.2f, :,, :>10 e amigos, tudo seguindo {value:[align][width][.precision][type]}. Aprenda as partes 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 depois dos dois-pontos significa o que aquele tipo decide, o que é por que :5 preenchimento texto e números em direções opostas. O sinalizador a manter é !r: mostra um valor do jeito que você digitaria, então espaço em branco perdido e outro lixo invisível salta fora no momento em que saída parece errada.

Strings multilinhas

Para escrever uma string que se estende por 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ê as escreveu.

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

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

python
message = """
Dear Alice,

Thank you for your order.

Best regards,
The Team
"""
JunoStrings multilinhas Três aspas marcas em cada extremidade deixa uma string rodar através de várias linhas, e Python mantém cada quebra de linha e espaço exatamente como você digitou. Prefira-os quando você tem um bloco de texto, como uma mensagem ou um template, que não cabe confortavelmente em uma linha.
JunoStrings multilinhas Aspas triplas preservam quebras de linha e espaçamento verbatim, então se adequam a templates de email, SQL, e qualquer bloco longo. Eles também são como docstrings funcionam: uma string com aspas triplas no topo de uma função ou classe fica sua documentação embutida. Observe a indentação, já que os espaços que você adiciona para alinhá-la terminam dentro do texto.
JunoStrings multilinhas Tudo dentro de aspas triplas é mantido literalmente, espaço em branco à esquerda incluído, que é a pegadinha: indente o literal para combinar seu código e aquela indentação cai no valor. Coloque um curto no topo de uma função ou classe e fica a docstring que help() mostra. Quando você precisa dela indentada na fonte mas limpa no valor, passe através de textwrap.dedent().

Sequências de escape

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 representa algo. As duas que você vai usar constantemente são \n para uma nova linha e \t para uma aba.

Sequências de escape deixam você embutir caracteres que de outra forma quebrariam a sintaxe ou não podem ser digitados diretamente. Aquelas que você vai preferi: \n (nova linha), \t (aba), \\ (uma barra invertida literal), \" e \' (aspas dentro de uma string delimitadora combinadora). Caminhos Windows requerem barras invertidas, que colidem com processamento de escape. Prefixe com r para desabilitar.

Além das comuns \n e \t, Python suporta escapes Unicode para caracteres que você não pode digitar diretamente: \uXXXX e \UXXXXXXXX nomeiam um caractere por seu número, e \N{name} nomeiam em palavras, como \N{GREEK SMALL LETTER ALPHA}. Aquele a preferi em código real é a raw string, escrita r"...", que desliga manuseio de escape inteiramente e passa cada barra invertida através inalterada. Use-a para caminhos Windows e para padrões de expressão regular, onde as barras invertidas são destinadas para aquele consumidor em vez de Python, e onde esquecer r produz padrões que silenciosamente combinam a coisa errada.

SequênciaCaractere
\nNova linha
\tAba
\\Barra invertida literal
\"Aspas duplas
\'Aspas simples
python
print("Line one\nLine two")        # duas linhas de saída
print("Name:\tAlice")              # Name:   Alice
path = r"C:\Users\Alice\Documents" # raw string, sem processamento de escape
JunoSequências de escape Uma barra invertida dentro de uma string significa "leia o próximo caractere especialmente": \n começa uma nova linha, \t insere uma aba, \\ é uma verdadeira barra invertida. Aquelas duas, \n e \t, são aquelas que você realmente digitará. Coloque um r antes da aspas e barras invertidas voltam a ser simples, útil para caminhos Windows.
JunoSequências de escape\n, \t, \\, e \" cobrem os escapes do dia a dia. Aquele que economiza dores de cabeça: uma string bruta, r"...", desliga processamento de escape então cada barra invertida fica literal. Use-a para caminhos Windows e padrões regex, onde as barras invertidas são destinadas para algo outro que não Python.
JunoSequências de escape Passado \n e \t há escapes Unicode como \N{name}, mas a ferramenta de trabalho é a string bruta r"...", que passa cada barra invertida intocada. Prefira-a em padrões regex e caminhos Windows, já que esquecer dá um padrão que silenciosamente combina a coisa errada em vez de um erro que diz a você.

Verificando conteúdo de string

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() deixa você verificar se uma string é todos 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 de toda a string 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 a capturar o ValueError coberto no capítulo Files and exceptions.

Essas verificações perguntam "é cada caractere deste tipo" através de todo Unicode, não apenas as letras e dígitos ASCII simples. Isso significa "2".isdigit() é True para o dois sobrescrito bem como para o "2" ordinário, 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() é mais largo ainda, contando frações e outros caracteres com valor numérico, então prefira a 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
JunoVerificando conteúdo de string Os métodos is* respondem perguntas sim-ou-não e retornam True apenas quando cada caractere se encaixa. Aquele que você vai usar primeiro: chame isdigit() antes de int() para ter certeza de que o texto realmente é um número, então entrada estranha não o derruba.
JunoVerificando conteúdo de string Cada método is* é True apenas se a string inteira passa, o que os torna úteis para validar entrada antes de converter. isdigit() antes de int() é a guarda clássica. Lembre-se que está testando a string inteira, então uma string vazia retorna False para todos eles.
JunoVerificando conteúdo de string Essas verificações cobrem 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, par: s.isascii() and s.isdigit(). Escolha a verificação mais estreita que combina sua entrada real em vez da primeira que parece próxima.

Na prática

Remova espaço em branco, normalize maiúsculas/minúsculas, depois puxe o que você precisa. Esta sequência cuida de quase qualquer texto fornecido pelo usuário:

python
raw_input = "  [email protected]  "
email = raw_input.strip().lower()   # "[email protected]"

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

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

Construindo uma URL de partes e imediatamente validando e analisando-a:

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 a fronteira, fatiamento extrai as partes, e a especificação de formato >8 alinha à direita o rótulo de severidade para que colunas fiquem consistentes quando nomes de nível diferem em comprimento.

Referência de métodos

MétodoO que faz
.lower() / .upper()Converte para todo minúsculo / todo maiúsculo
.title() / .capitalize()Capitaliza cada palavra / apenas a primeira
.strip() / .lstrip() / .rstrip()Remove espaço em branco ao redor
.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)Substitui ocorrências
.split(sep)Divide em uma lista
sep.join(iterable)Junta itens em uma string
.isdigit() / .isalpha() / .isalnum()Verificações de tipo de caractere