13 Dicas Úteis para Manipular Strings em Python do Jeito Mais Fácil

Uma string, representada pelo tipo de dado str em Python, contém uma sequência imutável de caracteres codificados no formato UTF-8.

Saber manipular uma string é fundamental para qualquer programador, já que todo programa que lida com valores em formato texto ou que faz qualquer tipo de interação com o usuário precisa usar esse tipo de dado.

Por ser um tipo de sequência em Python, a string é muito flexível. Então, é possível processar seu conteúdo de diversas formas.

No entanto, as diferentes maneiras de processar uma string podem até produzir um resultado errado, se utilizadas sem o conhecimento necessário.

Além disso, uma string em Python pode ter qualquer tamanho. O limite é dado pela quantidade de memória disponível no computador.

Isso significa que o processamento ineficiente de uma string muito grande, repetido várias vezes, pode fazer com que o seu programa fique lento.

Por isso, nesse post eu apresento 13 dicas úteis para manipular uma string em Python do jeito mais fácil, ou, como os programadores Python gostam de dizer, “do jeito pythônico”.

Eu sugiro que você execute o código Python mostrado nesse post no Jupyter Lab para treinar.

O Jupyter Lab é uma ferramenta ótima para começar a programar e deve fazer parte da sua lista de ferramentas como programador.

Se você ainda não tem o Jupyter Lab instalado, dá uma olhada nesse post onde eu explico o passo-a-passo para a instalação.

Como Usar Aspas Dentro de Aspas em uma String Python?

Uma string em python é delimitada por aspas simples (') ou duplas ("). Para usar um tipo de aspas dentro de uma string, delimite a string com o outro tipo, ou use uma barra invertida \ como caractere de escape. Por exemplo, a string 'Ela disse: "Sim!" ' é delimitada com aspas simples, para poder conter aspas duplas. A mesma string poderia ser escrita como "Ela disse: \"Sim!\"".

Caso a sequência de escape seja usada, quando a string é impressa, as barras invertidas são removidas e só as aspas são mostradas.

O resultado da função print() apresenta a string sem as aspas delimitadoras.

>>> print('Ela disse: "Sim!"') Ela disse: "Sim!" >>> print("Ela disse: \"Sim!\"") Ela disse: "Sim!"

Sempre que possível favoreça a primeira forma, delimitando a string em aspas de outro tipo, por ser mais legível.

Também é possível usar um conjunto de três aspas simples ou duplas (''' ou """) para delimitar uma string.

Nesse caso, a string pode se estender por mais de uma linha. Além disso, as regras de escape ou do uso de um tipo diferente de aspas não se aplicam da mesma forma a esse tipo de string.

>>> print("""Ela disse: "Sim!" """) Ela disse: "Sim!" >>> print("""Ela disse: ... ... "Sim!" """) Ela disse: "Sim!"

A única restrição é que as aspas internas não estejam coladas nas aspas triplas delimitadoras, ou o Python vai interpretar isso como 4 aspas consecutivas e gerar um erro.

>>> print('''Ela disse: ... ... 'Sim!'''') File "<stdin>", line 3 'Sim!'''') ^ SyntaxError: EOL while scanning string literal

Se você quiser que a string mostre a barra invertida \, é preciso usar uma outra barra como caractere de escape, ou usar o prefixo r para criar uma raw string.

>>> # \\ é a sequência de escape da \ >>> # \" é a sequência de escape das aspas duplas " >>> print("Ela disse: \\\"Sim!\\\"") Ela disse: \"Sim!\" >>> print(r"Ela disse: \"Sim!\"") # raw string Ela disse: \"Sim!\"

Como Concatenar Strings em Python?

A maneira mais comum de concatenar strings em Python é usando o operador +, como em s = 'vai' + 'programar' + '.com'. Com ele, é possível juntar qualquer quantidade de strings literais ou de variáveis do tipo str. Para concatenar somente strings literais, o operador + pode ser omitido e as strings separadas por qualquer quantidade de espaços, como no exemplo s = 'vai''programar' '.com'.

A seguir eu mostro algumas das maneiras de escrever os exemplos acima.

>>> 'vai' + 'programar' + '.com' 'vaiprogramar.com' >>> 'vai' + 'programar' + ".com" # Aspas simples e duplas 'vaiprogramar.com' >>> 'vai''programar' '.com' # Com e sem espaço 'vaiprogramar.com' >>> '''vai ... ''''programar'".com" 'vai\nprogramar.com' >>> dominio = 'vai' + 'programar' >>> sufixo = ".com" >>> dominio + sufixo 'vaiprogramar.com'

Veja que é possível misturar aspas simples e duplas nas strings concatenadas. Também é possível concatenar strings delimitadas com conjuntos de três aspas, mas o caractere de nova linha \n acaba fazendo parte do resultado.

Atenção para o fato de que a operação de concatenação de strings retorna um novo objeto, já que a string é imutável. Se o código não atribuir o resultado à variável original ou a uma nova variável, ele será perdido.

>>> s = 'vai' >>> s + 'programar.com' 'vaiprogramar.com' >>> print(s) vai >>> s = s + 'programar.com' >>> print(s) vaiprogramar.com

Apesar de ser muito fácil de fazer, a concatenação de strings tem algumas restrições. Por exemplo, o operador + não faz a conversão implícita de tipos.

>>> 'U' + 2 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: can only concatenate str (not "int") to str

O erro acima acontece porque 2 é um inteiro e a operação de concatenação só funciona para strings.

Além disso, não é possível omitir o operador + se uma das strings não for um valor literal.

>>> dominio '.com' File "<stdin>", line 1 dominio '.com' ^ SyntaxError: invalid syntax

É possível concatenar uma string a ela mesma, apenas multiplicando a string por um número inteiro n. Caso o valor de n seja negativo, o retorno é uma string vazia.

>>> 'io' * 2 'ioio' >>> sufixo = ".com" >>> sufixo * 3 '.com.com.com' >>> sufixo * -1 ''

Concatenar strings é uma das operações mais comuns quando você precisa lidar com texto e, apesar de simples, pode criar problemas de performance no seu programa, se usada de forma ineficiente.

Um exemplo de código que pode ter uma performance ruim é usar um laço for para concatenar elementos de uma lista.

>>> s = '' >>> lista = ['a', 'b', 'c', 'd'] >>> for l in lista: ... s = s + l # Não faça isso! ... >>> print(s) abcd

Se essa lista tiver muitos elementos e essa operação for executada muitas vezes, o seu programa pode ficar muito lento.

Para saber como concatenar os elementos de uma lista em uma string, veja a seção “Como Transformar uma Lista em String no Python?” nesse post.

Como Procurar uma Palavra em uma String Python?

Para saber se uma string em Python contém uma palavra, ou seja, uma substring, use o operador in, como no exemplo: 'pro' in 'vaiprogramar'. Essa expressão retorna True se a substring for encontrada. Para encontrar o primeiro índice no qual a substring aparece dentro da string, use a função find(), se quiser percorrer a string da esquerda para a direita, ou rfind(), para pesquisar da direita para a esquerda.

>>> 'pro' in 'vaiprogramar' True >>> 'vaiprogramar'.find('pro') 3 >>> 'vaiprogramar'.find('a') 1 >>> 'vaiprogramar'.rfind('a') 10

Se você quiser saber se uma string começa com um certo texto, use a função startswith(). De maneira parecida, para saber se a string termina com um texto, use endswith().

>>> 'vaiprogramar'.startswith('vai') True >>> 'vaiprogramar'.endswith('amar') True

A função index() funciona da mesma forma que find(). A única diferença é que um ValueError é gerado se a substring não for encontrada.

Para obter uma substring de uma string, veja a seção “Como Fatiar uma String em Python?” nesse post.

Como Alterar uma String em Python?

Para alterar o conteúdo de uma string, use a função str.replace(). Observe que uma string em Python é um objeto imutável e, uma vez criada, não pode ser alterada. Portanto, a função replace() retorna como resultado uma nova string, que deve ser atribuída à variável original.

>>> s = 'abcdefghijk' >>> s = s.replace('f', '_') >>> print(s) abcde_ghijk

Veja que não é possível atribuir um valor a uma fatia da string, já que ela é imutável.

>>> s = 'abcdefghijk' >>> s[5:6] = '_' Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'str' object does not support item assignment

Se você pesquisar na Internet, pode encontrar outra forma de substituir caracteres em uma string, transformando a string em uma lista primeiro, aplicando a substituição e depois transformando a lista de volta em string.

Apesar de funcionar, essa abordagem é mais complexa e tem performance pior.

Eu testei o tempo de execução da função replace() e comparei com duas alternativas que convertem a string em uma lista.

Veja na imagem a seguir o resultado da comparação.

Teste de performance da função replace()
Figura 1 – Teste de performance da função replace()

A primeira alternativa, usando as funções join() e split(), é quase duas vezes mais lenta.

Já a segunda alternativa, com as funções list() e index(), leva quatro vezes mais tempo para executar.

Assim, observando os resultados dos testes acima, além do Zen of Pyhton  e do princípio da Navalha de Ockham, a versão mais simples é mesmo a melhor opção.

No entanto, há situações em que você vai precisar de uma solução mais complexa.

Quer um exemplo?

A função replace() lê a string da esquerda para a direita.

>>> s = '010' >>> s = s.replace('0', '1', 1) # Troca só o 1o '1' por '0'. >>> print(s) 110

Se você quiser substituir apenas os n últimos caracteres da string, vai precisar de uma função que processe a string da direita para a esquerda.

Nesse caso, você pode adaptar uma das soluções mostradas acima para usar a função rsplit(), que divide a string começando pela direita.

>>> s = '010' >>> s = '1'.join(s.rsplit('0', 1)) >>> print(s) 011

Outra solução seria inverter a string, aplicar a função replace() da mesma forma e, por fim, inverter a string de novo.

>>> s = '010' >>> s = s[::-1].replace('0', '1', 1)[::-1] >>> print(s) 011

Medindo a performance de cada uma dessas opções, mais uma vez é possível verificar uma diferença significativa entre elas.

Teste de performance da função replace() com string invertida
Figura 2 – Teste de performance da função replace() invertendo a string.

A versão que usa o fatiamento para inverter a string é duas vezes mais lenta.

Portanto, quando estiver em dúvida, use o módulo timeit para medir o tempo de execução e avalie também a legibilidade de cada alternativa.

Como Fatiar uma String em Python?

Uma string em Python é uma sequência de dados codificados como caracteres, iniciada na posição 0. Assim, para acessar um caractere em uma string, use o índice entre colchetes, como no exemplo s[3]. Para fatiar uma string, use a mesma sintaxe, mas fornecendo um intervalo com início e fim, separado por :, como em s[0:3].

>>> s = 'vaiprogramar' >>> s[3] 'p' >>> s[0:3] 'vai'

Veja que a fatia retornada por s[<início>:<fim>] começa no caractere especificado como inicio, mas termina no caractere fim – 1, ou seja, o caractere na posição fim da fatia não é retornado.

É possível usar índices e intervalos positivos ou negativos.

Os intervalos positivos começam em 0.

Como -0 é igual a 0, os índices negativos começam em -1, a partir do final da string e vão diminuindo até a primeira letra.

Índices positivos e negativos em uma string Python
Figura 3 – Índices positivos e negativos em uma string Python.

No entanto, a fatia da string sempre deve ser especificada da esquerda para a direita, ou seja, o valor do início do intervalo sempre é um número menor que o valor do fim.

Se você inverter a ordem dos argumentos e o intervalo não fizer sentido, uma string vazia é retornada.

>>> s = 'vaiprogramar' >>> s[-9] 'p' >>> s[3] == s[-9] True >>> s[-4:-1] 'ama' >>> s[-1:-4] ''

Você pode até misturar índices positivos e negativos. Mas, por favor, não faça isso a não ser que essa seja a única solução! Fica horrível de ler.

>>> s[0:-9] 'vai'

Se você não especificar um valor para o início da fatia, o padrão é começar no primeiro caractere da string. O mesmo acontece para o fim. Se o valor for omitido, o intervalo retorna todos os caracteres até o último.

>>> s[:3] 'vai' >>> s[3:] 'programar' >>> s[:] 'vaiprogramar'

É possível especificar um terceiro argumento para o intervalo, que determina o incremento, ou o “passo” dado na fatia retornada.

Por exemplo:

>>> s = ('ar' * 3)[:-1] >>> s 'arara' >>> s[::2] 'aaa' >>> s[1::2] 'rr'

Caso o índice faça referência a uma posição inexistente na string, um IndexError é lançado.

Já para intervalos errados, o Python é mais tolerante e só retorna uma string vazia.

>>> s = 'A' >>> s[8] Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: string index out of range >>> s[8:9] ''

A sintaxe de fatiamento da string com colchetes permite obter partes da string a partir dos índices de cada caractere.

Mas quando você quiser dividir uma string com base em um separador, use a função split(). Ela retorna uma lista de strings, sem o caractere separador.

>>> s = 'www.google.com.br' >>> s.split('.') ['www', 'google', 'com', 'br'] >>> s = '1,2,3, 4' >>> s.split(',') ['1', '2', '3', ' 4']

Se você não fornecer um argumento como separador para a função split(), o padrão é separar por espaços em branco, incluindo caracteres de tabulação e nova linha.

Nesse caso, qualquer quantidade de espaços em branco conta como um separador.

>>> s = '1\t\t\t 2 \n3 4' >>> s.split() ['1', '2', '3', '4']

Como Excluir um Caractere de uma String em Python?

Para excluir um caractere de uma string em Python, substitua o caractere por uma string vazia, usando a função str.replace(). Evite fatiar a string deixando o caractere excluído de fora dos intervalos e juntando as fatias depois. Isso prejudica a legibilidade e a performance do programa.

>>> s = 'vaiprogramar.com' >>> s.replace('.', '') 'vaiprogramarcom' >>> s = 'www.google.com.br' >>> s.replace('.', '') 'wwwgooglecombr'

Para substituir apenas as primeiras n ocorrências de um caractere, passe n como terceiro argumento para a função replace().

>>> s.replace('.', '', 2) 'wwwgooglecom.br'

Talvez você pense que fatiar a string antes e depois desse caractere e juntar os pedaços depois seja uma boa opção.

Na verdade, não é.

>>> s = 'vaiprogramar.com' >>> s[:12] + s[13:] 'vaiprogramarcom'

Além de ser menos legível que a função replace(), essa alternativa só funciona se você souber a posição exata do caractere que deve ser substituído.

Além disso, há um outro problema: o tempo de execução.

Nos testes que eu fiz, para remover um caractere, as duas soluções têm performance parecida.

Comparativo de performance função replace e fatiamento
Figura 4 – Comparativo de performance da função replace() com o fatiamento de strings.

No entanto, quando a quantidade de caracteres a remover aumenta, a performance da opção com fatiamento fica muito pior. Além disso, a legibilidade fica muito ruim.

Comparativo de performance da função replace() com o fatiamento de strings.
Figura 5 – Comparativo de performance da função replace() com o fatiamento de strings.

Mais uma vez, eu recomendo que você só faça isso se você tiver um bom motivo. Na dúvida, sempre use as funções disponíveis na biblioteca padrão Python, em vez de inventar suas próprias soluções.

Como Remover Espaços em Branco em uma String no Python?

A função strip(), quando usada sem argumentos, retorna uma cópia da string com os espaços em branco dos dois lados removidos. Para remover apenas os espaços à direita da string use a função rstrip() e para remover apenas os espaços à esquerda, use lstrip().

>>> s = ' vai programar ' >>> s ' vai programar ' >>> s.lstrip() 'vai programar ' >>> s.rstrip() ' vai programar' >>> s.strip() 'vai programar'

Observe que as funções não removem os caracteres no meio da string, apenas nas extremidades.

Na verdade, você pode passar qualquer conjunto de caracteres como argumento para a família de funções strip().

Essa função funciona retirando esses caracteres a partir das extremidades da string original, até que um caractere que não faz parte do argumento seja encontrado.

Por exemplo:

>>> s = '_#_#_#_#_vai_#_programar_#_#_#_#_' >>> s '_#_#_#_#_vai_#_programar_#_#_#_#_' >>> s.strip('_#') 'vai_#_programar'

No exemplo acima, a função remove todos os caracteres _ e #, até encontrar a letra v no início da palavra e a letra r no fim. Por isso, os caracteres _ e # no meio da string não são removidos.

Para remover espaços em branco, basta não fornecer um argumento para a função strip(). Todos os espaços em branco são removidos, inclusive caracteres de nova linha \n e tabulação \t.

>>> s = '\n \t vai programar\n ' >>> print(s) vai programar >>> print(s.strip()) vai programar

Como Transformar uma Lista em String no Python?

Para transformar uma lista em string no Python, use a função join(). A função é chamada a partir do objeto str que será usado como separador no resultado. Ela recebe como argumento a lista que deve ser concatenada. Se algum dos elementos da lista não for do tipo str, é gerado um TypeError.

Nos exemplos abaixo, uma string vazia e um ponto são usados como caracteres separadores entre as strings.

>>> lista = ['vai', 'programar'] >>> s = ''.join(lista) >>> print(s) vaiprogramar >>> lista = ['vaiprogramar', 'com'] >>> s = '.'.join(lista) >>> print(s) vaiprogramar.com

A função join() coloca o separador entre as strings da lista, mas nunca após o último elemento da lista. Dessa forma, se a lista só tiver um elemento, nenhum separador é usado.

>>> lista = ['vaiprogramar'] >>> s = '.'.join(lista) >>> print(s) vaiprogramar

Na verdade, qualquer tipo de objeto iterable pode ser usado como argumento para a função join(). Veja o exemplo abaixo, usando uma tupla.

>>> tupla = ('vaiprogramar', 'com') >>> s = '.'.join(tupla) >>> print(s) vaiprogramar.com

Como Transformar uma String em int no Python?

Para transformar uma string em um número inteiro no Python, use a função int(), passando como argumento a string que deve ser convertida. O padrão é retornar um inteiro decimal, mas é possível especificar a base, já que um int em Python também pode representar um número binário, octal ou hexadecimal.

A função int() retorna 0 se nenhum argumento for especificado e produz um ValueError se a string não representar um número inteiro válido.

>>> int('13') 13 >>> int('1101', 2) 13 >>> hexa = '0x7e3' >>> int(hexa, base = 16) 2019 >>> int() 0 >>> int('vaiprogramar') Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: invalid literal for int() with base 10: 'vaiprogramar'

A string passada como argumento deve conter apenas números. Se o número existente na String tiver vírgulas como separadores de milhares, elas devem ser removidas com a função replace() antes da conversão.

>>> int('10,000') Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: invalid literal for int() with base 10: '10,000' >>> int('10,000'.replace(',','')) 10000

As exceções são:

  • Os sinais + e -.
  • O underscore  _, usado para separar milhares.
  • Os caracteres usados para representar um número em uma base diferente, como 0b para binário, 0o para octal e 0x para hexadecimal, desde que a base seja especificada no argumento base.
>>> int('0b10', 2) 2 >>> int('0o10', 8) 8 >>> int('0x10', 16) 16 >>> int('-10_000') -10000

Quando a string representar um número do tipo float e você quiser um número inteiro, faça primeiro a conversão usando a função float() e depois use a função int() para obter só a parte inteira.

Uma alternativa é usar a função round() passando o float como argumento, para arredondar para o número inteiro mais próximo, mas o resultado pode ser diferente da parte inteira da string original.

Outra maneira um pouco mais eficiente de fazer essa conversão é separar a string pelo . usando a função partition() e usar apenas o primeiro elemento da lista como argumento para a função int().

Performance da função int()
Figura 6 – Teste de performance da função int()

Se a string não estiver em base 10, mas representar um número decimal válido, é preciso fornecer a base como argumento para a função int(), senão a conversão vai funcionar mas o resultado não será o esperado.

>>> binario = 0b110 >>> binario 6 >>> s = '110' >>> int(s) 110 >>> int(s, 2) 6

Uma maneira de reduzir esse risco é sempre usar os prefixos das bases nas strings, quando o número representado não estiver na base 10. Dessa forma, sempre ocorrerá um erro se a base não for especificada. Por exemplo:

>>> int('0b1101', 2) 13 >>> int('0b1101') Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: invalid literal for int() with base 10: '0b1101'
!

Não confunda a função int() com a função ord().

A função ord() recebe como argumento um caractere e retorna seu código Unicode. Por exemplo, ord('§') retorna 167. Esse valor é o ponto de código do caractere § na codificação UTF-8.

Como Transformar uma String em float no Python?

Para transformar uma string em um número de ponto-flutuante no Python, use a função float(), passando a string como argumento.

>>> float('1e10') 10000000000.0 >>> float('3.14e-2') 0.0314 >>> float('1') 1.0 >>> float('-10_000') -10000.0

Assim como na função int(), executar a função float() sem argumentos retorna 0.0. De maneira diferente de int(), a função float() não tem um parâmetro para especificar a base.

Como Transformar uma String em data e hora no Python?

Use a função datetime.strptime(<string>, <formato>) para obter um objeto datetime.datetime a partir de uma string com o formato especificado. Para obter apenas a data em um objeto datetime.date, use o método date() no objeto datetime retornado. De forma semelhante, para obter apenas o horário em um objeto datetime.time, use o método time() no objeto datetime retornado.

from datetime import datetime >>> string = "15/08/2017 10:49" >>> data = datetime.strptime(string, "%d/%m/%Y %H:%M") >>> print("data: ", data) data: 2017-08-15 10:49:00 >>> print("tipo de dado: ", type(data)) tipo de dado: <class 'datetime.datetime'> >>> data = datetime.strptime(string, "%d/%m/%Y").date() >>> print("data: ", data) data: 2017-08-15 >>> print("tipo de dado: ", type(data)) tipo de dado: <class 'datetime.date'> >>> data = datetime.strptime(string, "%d/%m/%Y %H:%M").time() >>> print("data: ", data) data: 10:49:00 >>> print("tipo de dado: ", type(data)) tipo de dado: <class 'datetime.time'>

Para ver a lista completa formatos para a conversão de string em data e vice-versa, consulte a documentação do Python.

O objeto datetime retornado pela função strptime() pode conter o fuso horário, desde que a string original contenha essa informação.

>>> string = "15/08/2017 10:49 -03:00" >>> data = datetime.strptime(string, "%d/%m/%Y %H:%M %z") >>> print("data: ", data) data: 2017-08-15 10:49:00-03:00 >>> print(data.utcoffset()) -1 day, 21:00:00 >>> print(data.tzname()) UTC-03:00

Para ter acesso a opções avançadas de datas com fuso horário, sugiro que você use as bibliotecas iso8601 e python-dateutil.

Como Converter uma String para JSON em Python?

A maneira de criar e ler objetos JSON em Python é usando o módulo embutido json. Como no formato JSON os dados são escritos em pares de chave:valor, a função loads() do módulo json converte uma string em formato JSON para um objeto do tipo dicionário em Python. Os arrays existentes no objeto JSON são convertidos para listas.

Os valores null, true e false do objeto JSON são convertidos para os tipos correspondentes em Python, None, True e False.

import json stringJSON = ''' { "alunos": [ { "nome": "Maria", "dataNascimento": "01/07/1998", "matriculado": true, "cursosEmAndamento": null }, { "nome": "João", "dataNascimento": "01/07/1973", "matriculado": true, "cursosEmAndamento": 2 } ] } ''' dic = json.loads(stringJSON) alunos = dic['alunos'] for aluno in alunos: print(aluno['nome'], '\t', aluno['cursosEmAndamento'])

O exemplo acima imprime os valores das chaves nome e cursosEmandamento de cada um dos objetos da lista alunos.

Maria None João 2

Como Verificar se uma String é um Número em Python?

Para ter certeza de que uma string é um número em Python, converta a string para float. Se a conversão não lançar um ValueError, a string representa um número válido. Lembre-se que na linguagem Python só há dois tipos de dados primitivos que representam números*: inteiro e ponto-flutuante, mas um int sempre é considerado um float válido.

Se o objetivo é verificar se uma string só contém números, use a função isdigit(). Mas atenção: essa função só verifica se todos os caracteres da string são dígitos de 0 a 9. Caso haja qualquer outro caractere, como um sinal negativo - ou um ponto ., a função retorna False.

>>> float('-99') -99.0 >>> float('-99.') -99.0 >>> float('noventa e nove') Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: could not convert string to float: 'noventa e nove' >>> '99'.isdigit() True >>> '99.1'.isdigit() False >>> '-99'.isdigit() False >>> '99_000'.isdigit() False

Preste atenção para o fato de que os valores NaN, +inf, -inf e Infinity são considerados floats válidos!

>>> type(float('NaN')) == float True >>> type(float('-inf')) == float True >>> type(float('inf')) == float True

Por isso, se você quiser verificar se a string representa um valor do conjunto dos números reais, precisa desconsiderar esses valores especiais.

Para facilitar, você pode colocar todas essas condições em uma função que retorna um float se a conversão funcionar, ou None se a string não puder ser convertida em número.

def strFloat(entrada): try: numero = float(entrada) isFloat = 'inf' not in entrada.lower() isFloat = isFloat and numero == numero # NaN == NaN retorna False if not isFloat: numero = None except ValueError: numero = None return numero

Veja abaixo os resultados da chamada dessa função com alguns valores de teste.

>>> print(strFloat('-10_000.99')) -10000.99 >>> print(strFloat('NaN')) None >>> print(strFloat('-inf')) None >>> print(strFloat('inf')) None >>> print(strFloat('vaiprogramar')) None

* O tipo de dado complex, que representa um número complexo, não foi considerado porque seu uso é muito menos comum que o dos demais tipos numéricos.

Conclusão

Nesse post você viu as maneiras mais usuais de manipular strings em Python. Pode ter certeza de que você vai usar a maioria dessas formas em seus programas, senão todas.

Como a linguagem Python é bastante flexível e está em constante evolução, outras formas podem ser usadas para obter o mesmo resultado.

No entanto, é importante sempre levar em consideração que o objeto string é imutável e qualquer operação sobre ele acaba produzindo um novo objeto.

Isso quer dizer que, se o volume de operações for muito grande, o seu programa pode ficar lento.

Portanto, sempre verifique se você está usando a maneira mais eficiente de manipular uma string. Na dúvida, use o módulo timeit para verificar se o tempo de execução pode ser melhorado.

Você usa outra maneira para realizar alguma dessas operações? Então escreva nos comentários e ajude a melhorar esse post. E comente também se você encontrou o Easter Egg escondido nos exemplos de código!

Guilherme Brügger D Amato - Audiência Pública na Comissão Senado do Futuro

Guilherme Brügger D’Amato é servidor concursado de TI na Câmara dos Deputados, onde ocupou o cargo de Diretor de Informática entre 2015 e 2016. Com mais de 25 anos de experiência como programador e executivo de TI, já desenvolveu sites e sistemas usados por dezenas de milhões de pessoas. Conecte-se com ele no LinkedIn.

Deixe um comentário