Introdução
Esta seção introduz maneiras de trabalhar com texto.
This tutorial is from open-source community. Access the source code
Esta seção introduz maneiras de trabalhar com texto.
Literais de string (string literals) são escritos em programas com aspas.
## Single quote
a = 'Yeah but no but yeah but...'
## Double quote
b = "computer says no"
## Triple quotes
c = '''
Look into my eyes, look into my eyes, the eyes, the eyes, the eyes,
not around the eyes,
don't look around the eyes,
look into my eyes, you're under.
'''
Normalmente, strings podem abranger apenas uma única linha. Aspas triplas capturam todo o texto contido em várias linhas, incluindo toda a formatação.
Não há diferença entre usar aspas simples (') versus aspas duplas ("). No entanto, o mesmo tipo de aspas usado para iniciar uma string deve ser usado para terminá-la.
Códigos de escape (escape codes) são usados para representar caracteres de controle e caracteres que não podem ser facilmente digitados diretamente no teclado. Aqui estão alguns códigos de escape comuns:
'\n' Nova linha (Line feed)
'\r' Retorno de carro (Carriage return)
'\t' Tabulação (Tab)
'\'' Aspas simples literais (Literal single quote)
'\"' Aspas duplas literais (Literal double quote)
'\\' Barra invertida literal (Literal backslash)
Cada caractere em uma string é armazenado internamente como um chamado "code-point" Unicode, que é um inteiro. Você pode especificar um valor de code-point exato usando as seguintes sequências de escape:
a = '\xf1' ## a = 'ñ'
b = '\u2200' ## b = '∀'
c = '\U0001D122' ## c = '𝄢'
d = '\N{FOR ALL}' ## d = '∀'
O Unicode Character Database é uma referência para todos os códigos de caracteres disponíveis.
Strings funcionam como um array para acessar caracteres individuais. Você usa um índice inteiro, começando em 0. Índices negativos especificam uma posição relativa ao final da string.
a = 'Hello world'
b = a[0] ## 'H'
c = a[4] ## 'o'
d = a[-1] ## 'd' (end of string)
Você também pode fatiar (slice) ou selecionar substrings especificando um intervalo de índices com :.
d = a[:5] ## 'Hello'
e = a[6:] ## 'world'
f = a[3:8] ## 'lo wo'
g = a[-5:] ## 'world'
O caractere no índice final não está incluído. Índices ausentes assumem o início ou o fim da string.
Concatenação, comprimento, teste de pertinência (membership) e replicação.
## Concatenação (+)
a = 'Hello' + 'World' ## 'HelloWorld'
b = 'Say ' + a ## 'Say HelloWorld'
## Comprimento (len)
s = 'Hello'
len(s) ## 5
## Teste de pertinência (`in`, `not in`)
t = 'e' in s ## True
f = 'x' in s ## False
g = 'hi' not in s ## True
## Replicação (s * n)
rep = s * 5 ## 'HelloHelloHelloHelloHello'
Strings possuem métodos que realizam diversas operações com os dados da string.
Exemplo: remoção de espaços em branco no início/fim.
s = ' Hello '
t = s.strip() ## 'Hello'
Exemplo: Conversão de caixa (case).
s = 'Hello'
l = s.lower() ## 'hello'
u = s.upper() ## 'HELLO'
Exemplo: Substituição de texto.
s = 'Hello world'
t = s.replace('Hello' , 'Hallo') ## 'Hallo world'
Mais métodos de string:
Strings possuem uma grande variedade de outros métodos para testar e manipular os dados de texto. Este é um pequeno exemplo de métodos:
s.endswith(suffix) ## Verifica se a string termina com o sufixo
s.find(t) ## Primeira ocorrência de t em s
s.index(t) ## Primeira ocorrência de t em s
s.isalpha() ## Verifica se os caracteres são alfabéticos
s.isdigit() ## Verifica se os caracteres são numéricos
s.islower() ## Verifica se os caracteres estão em minúsculas
s.isupper() ## Verifica se os caracteres estão em maiúsculas
s.join(slist) ## Junta uma lista de strings usando s como delimitador
s.lower() ## Converte para minúsculas
s.replace(old,new) ## Substitui texto
s.rfind(t) ## Busca por t a partir do final da string
s.rindex(t) ## Busca por t a partir do final da string
s.split([delim]) ## Divide a string em uma lista de substrings
s.startswith(prefix) ## Verifica se a string começa com o prefixo
s.strip() ## Remove espaços em branco no início/fim
s.upper() ## Converte para maiúsculas
Strings são "imutáveis" (immutable) ou somente leitura. Uma vez criados, o valor não pode ser alterado.
>>> s = 'Hello World'
>>> s[1] = 'a'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
>>>
Todas as operações e métodos que manipulam dados de string, sempre criam novas strings.
Use str() para converter qualquer valor em uma string. O resultado é uma string contendo o mesmo texto que teria sido produzido pela instrução print().
>>> x = 42
>>> str(x)
'42'
>>>
Uma string de bytes de 8 bits, comumente encontrada em operações de I/O de baixo nível, é escrita da seguinte forma:
data = b'Hello World\r\n'
Ao colocar um 'b' minúsculo antes da primeira aspa, você especifica que é uma string de bytes em vez de uma string de texto.
A maioria das operações de string usuais funciona.
len(data) ## 13
data[0:5] ## b'Hello'
data.replace(b'Hello', b'Cruel') ## b'Cruel World\r\n'
A indexação é um pouco diferente porque retorna valores de bytes como inteiros.
data[0] ## 72 (ASCII code for 'H')
Conversão para/de strings de texto.
text = data.decode('utf-8') ## bytes -> text
data = text.encode('utf-8') ## text -> bytes
O argumento 'utf-8' especifica uma codificação de caracteres. Outros valores comuns incluem 'ascii' e 'latin1'.
Strings raw (brutas) são literais de string com uma barra invertida não interpretada. Elas são especificadas prefixando a aspa inicial com um "r" minúsculo.
>>> rs = r'c:\newdata\test' ## Raw (uninterpreted backslash)
>>> rs
'c:\\newdata\\test'
A string é o texto literal contido dentro, exatamente como digitado. Isso é útil em situações onde a barra invertida tem um significado especial. Exemplo: nome de arquivo, expressões regulares, etc.
Uma string com substituição de expressão formatada.
>>> name = 'IBM'
>>> shares = 100
>>> price = 91.1
>>> a = f'{name:>10s} {shares:10d} {price:10.2f}'
>>> a
' IBM 100 91.10'
>>> b = f'Cost = ${shares*price:0.2f}'
>>> b
'Cost = $9110.00'
>>>
Nota: Isso requer Python 3.6 ou mais recente. O significado dos códigos de formato será abordado mais tarde.
Nestes exercícios, você experimentará operações no tipo string do Python. Você deve fazer isso no prompt interativo do Python, onde pode ver facilmente os resultados. Nota importante:
Em exercícios onde você deve interagir com o interpretador,
>>>é o prompt do interpretador que você recebe quando o Python quer que você digite uma nova instrução. Algumas instruções no exercício abrangem várias linhas - para fazer essas instruções serem executadas, você pode ter que pressionar 'return' algumas vezes. Apenas um lembrete de que você NÃO digita o>>>ao trabalhar com esses exemplos.
Comece definindo uma string contendo uma série de símbolos de ações como este:
>>> symbols = 'AAPL,IBM,MSFT,YHOO,SCO'
>>>
Strings são arrays de caracteres. Tente extrair alguns caracteres:
>>> symbols[0]
?
>>> symbols[1]
?
>>> symbols[2]
?
>>> symbols[-1] ## Last character
?
>>> symbols[-2] ## Negative indices are from end of string
?
>>>
Em Python, strings são somente leitura (read-only).
Verifique isso tentando mudar o primeiro caractere de symbols para um 'a' minúsculo.
>>> symbols[0] = 'a'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
>>>
Embora os dados de string sejam somente leitura, você sempre pode reatribuir uma variável a uma string recém-criada.
Tente a seguinte instrução que concatena um novo símbolo "GOOG" ao final de symbols:
>>> symbols = symbols + 'GOOG'
>>> symbols
'AAPL,IBM,MSFT,YHOO,SCOGOOG'
>>>
Ops! Não era isso que você queria. Corrija-o para que a variável symbols contenha o valor 'AAPL,IBM,MSFT,YHOO,SCO,GOOG'.
>>> symbols = ?
>>> symbols
'AAPL,IBM,MSFT,YHOO,SCO,GOOG'
>>>
Adicione 'HPQ' ao início da string:
>>> symbols = ?
>>> symbols
'HPQ,AAPL,IBM,MSFT,YHOO,SCO,GOOG'
>>>
Nestes exemplos, pode parecer que a string original está sendo modificada, em aparente violação de strings serem somente leitura. Não é o caso. Operações em strings criam uma string totalmente nova a cada vez. Quando o nome da variável symbols é reatribuído, ele aponta para a string recém-criada. Depois, a string antiga é destruída, pois não está mais sendo usada.
Experimente com o operador in para verificar substrings. No prompt interativo, tente estas operações:
>>> 'IBM' in symbols
?
>>> 'AA' in symbols
True
>>> 'CAT' in symbols
?
>>>
Por que a verificação de 'AA' retornou True?
No prompt interativo do Python, tente experimentar com alguns dos métodos de string.
>>> symbols.lower()
?
>>> symbols
?
>>>
Lembre-se, strings são sempre somente leitura. Se você quiser salvar o resultado de uma operação, você precisa colocá-lo em uma variável:
>>> lowersyms = symbols.lower()
>>>
Tente mais algumas operações:
>>> symbols.find('MSFT')
?
>>> symbols[13:17]
?
>>> symbols = symbols.replace('SCO','DOA')
>>> symbols
?
>>> name = ' IBM \n'
>>> name = name.strip() ## Remove surrounding whitespace
>>> name
?
>>>
Às vezes, você quer criar uma string e embutir os valores de variáveis nela.
Para fazer isso, use uma f-string. Por exemplo:
>>> name = 'IBM'
>>> shares = 100
>>> price = 91.1
>>> f'{shares} shares of {name} at ${price:0.2f}'
'100 shares of IBM at $91.10'
>>>
Modifique o programa mortgage.py do Exercício 1.10 para criar sua saída usando f-strings. Tente fazer com que a saída seja bem alinhada.
Uma limitação das operações básicas de string é que elas não suportam nenhum tipo de correspondência de padrão avançada. Para isso, você precisa recorrer ao módulo re do Python e às expressões regulares. O tratamento de expressões regulares é um tópico extenso, mas aqui está um exemplo curto:
>>> text = 'Today is 3/27/2018. Tomorrow is 3/28/2018.'
>>> ## Find all occurrences of a date
>>> import re
>>> re.findall(r'\d+/\d+/\d+', text)
['3/27/2018', '3/28/2018']
>>> ## Replace all occurrences of a date with replacement text
>>> re.sub(r'(\d+)/(\d+)/(\d+)', r'\3-\1-\2', text)
'Today is 2018-3-27. Tomorrow is 2018-3-28.'
>>>
Para mais informações sobre o módulo re, consulte a documentação oficial em https://docs.python.org/library/re.html.
Ao começar a experimentar com o interpretador, você frequentemente quer saber mais sobre as operações suportadas por diferentes objetos. Por exemplo, como você descobre quais operações estão disponíveis em uma string?
Dependendo do seu ambiente Python, você pode ser capaz de ver uma lista de métodos disponíveis via preenchimento por tabulação (tab-completion). Por exemplo, tente digitar isto:
>>> s = 'hello world'
>>> s.<tab key>
>>>
Se pressionar a tecla Tab não fizer nada, você pode recorrer à função dir() embutida. Por exemplo:
>>> s = 'hello'
>>> dir(s)
['__add__', '__class__', '__contains__', ..., 'find', 'format',
'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace',
'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition',
'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit',
'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase',
'title', 'translate', 'upper', 'zfill']
>>>
dir() produz uma lista de todas as operações que podem aparecer após o (.). Use o comando help() para obter mais informações sobre uma operação específica:
>>> help(s.upper)
Help on built-in function upper:
upper(...)
S.upper() -> string
Return a copy of the string S converted to uppercase.
>>>
Parabéns! Você concluiu o laboratório de Strings. Você pode praticar mais laboratórios no LabEx para aprimorar suas habilidades.