Como obtenho uma substring de uma string no Python?


Respostas:


3178
>>> x = "Hello World!"
>>> x[2:]
'llo World!'
>>> x[:2]
'He'
>>> x[:-2]
'Hello Worl'
>>> x[-2:]
'd!'
>>> x[2:-2]
'llo Worl'

Python chama esse conceito de "fatia" e funciona em mais do que apenas strings. Dê uma olhada aqui para uma introdução abrangente.


401

Apenas por completude, como ninguém mais o mencionou. O terceiro parâmetro para uma fatia da matriz é uma etapa. Portanto, reverter uma string é tão simples quanto:

some_string[::-1]

Ou selecionar caracteres alternativos seria:

"H-e-l-l-o- -W-o-r-l-d"[::2] # outputs "Hello World"

A capacidade de avançar e retroceder na cadeia de caracteres mantém a consistência de poder organizar a fatia desde o início ou o fim.


21
@mtahmed absolutamente relacionado à questão. E se você quisesse substring selecionando caracteres alternativos da string? Isso seria my_string [:: 2]
Endophage

Eu acho que é mais provável que você queira mencionar o terceiro parâmetro para cortar. A necessidade de obter todos os outros caracteres de uma sequência pode ser um caso de uso importante em algum lugar, mas nunca precisei fazer isso. Não que exista algo errado em querer mostrar o que você sabe - qual é o sentido de saber as coisas se você não pode fazer isso. :) Mas o caso de relevância para a questão é exagerado.
John Lockwood

1
Certamente, o exemplo específico de seleção de caracteres alternativos pode não ser relevante para a pergunta, mas entender que existe um terceiro parâmetro para fatiar muito é relevante e os exemplos simples servem para ilustrar como ele funciona. A comunidade Python também tem uma grande história de educar novos membros de uma forma amigável :-)
endófago

127

Substr () normalmente (por exemplo, PHP e Perl) funciona desta maneira:

s = Substr(s, beginning, LENGTH)

Então os parâmetros são beginninge LENGTH.

Mas o comportamento do Python é diferente; espera início e um após END (!). Isso é difícil de identificar pelos iniciantes. Portanto, a substituição correta para Substr (s, começando, COMPRIMENTO) é

s = s[ beginning : beginning + LENGTH]

76
Os iniciantes devem aprender a maneira Python quando se deslocam para python, não furar a outros hábitos de linguagem
Nicu Surdu

3
E, para completar, o Java é como o Python, pois o método String.substring () assume o início e o fim de um passado. Este só me mordeu com força, eu tinha assumido que era comprido como qualquer outra função de substring no mundo.
PhilHibbs 10/01/19

4
Uma maneira (provavelmente) mais pitônica de fazer isso és[beginning:][:length]
victortv 12/03/19

2
Como alguém que começou com Python em vez de idiomas como [palavra suja] como PHP, acho que o Python é muito mais simples e intuitivo com sua string [começo: fim]. O comprimento geralmente não é relevante.
Gloweye 9/10/19

60

Uma maneira comum de conseguir isso é cortando as cordas.

MyString[a:b] fornece uma substring do índice a a (b - 1).


23

Um exemplo parece estar faltando aqui: cópia completa (rasa).

>>> x = "Hello World!"
>>> x
'Hello World!'
>>> x[:]
'Hello World!'
>>> x==x[:]
True
>>>

Este é um idioma comum para a criação de uma cópia dos tipos de sequência (não das seqüências internas) [:],. Raso copia uma lista, consulte Sintaxe de fatia de lista do Python usada sem motivo óbvio .


12
Isso não tem quase nada a ver com a pergunta sobre substring. Nem se aplica a string. Dizer stringA = stringB é suficiente ...
Nicu Surdu

2
O [:] cópia completa cria uma nova cópia, usa a sintaxe fatia e é lido como "substring do início ao fim"
gimel

2
Qual o sentido de as strings serem imutáveis? a=bdeve ser suficiente.
bfontaine

1
@ gimel: Na verdade, [:]em um tipo imutável não faz uma cópia. Enquanto mysequence[:]é principalmente inofensivo quando mysequenceé um tipo imutável como str, tuple, bytes(PY3) ou unicode(Py2), a = b[:]é equivalente a a = b, ele só perde um pouco de tempo despachando os códigos de byte de corte que o objeto responde a retornando em si, uma vez que é inútil cópia superficial quando , além dos testes de identidade do objeto, é equivalente a apenas retornar outra referência ao próprio eu imutável.
precisa

3
A tentativa de resumir as outras críticas de esta resposta: Em Python, strings são imutáveis, portanto, não há razão para fazer uma cópia de uma seqüência - para s[:]não fazer uma cópia de todo: s = 'abc'; s0 = s[:]; assert s is s0. Sim, era a maneira idiomática de copiar uma lista em Python até que as listas chegassem list.copy, mas uma fatia completa de um tipo imutável não tem motivos para fazer uma cópia, porque ela não pode ser alterada; portanto, pode haver apenas uma na memória e não devemos perder tempo copiando-o. Como esta resposta está errada e nem sequer responde à pergunta - ela deve ser excluída?
Aaron Hall

18

Existe uma maneira de substring uma string em Python, para obter uma nova string do terceiro caractere até o final da string?

Talvez como myString[2:end]?

Sim, isso realmente funciona se você atribuir ou vincular o nome endao singleton constante None:

>>> end = None
>>> myString = '1234567890'
>>> myString[2:end]
'34567890'

A notação de fatia possui 3 argumentos importantes:

  • começar
  • Pare
  • degrau

Os padrões deles quando não fornecidos são None- mas podemos ignorá-los explicitamente:

>>> stop = step = None
>>> start = 2
>>> myString[start:stop:step]
'34567890'

Se deixar a segunda parte significa 'até o fim', se você deixar a primeira parte, ela começa do começo?

Sim, por exemplo:

>>> start = None
>>> stop = 2
>>> myString[start:stop:step]
'12'

Observe que incluímos start na fatia, mas apenas subimos e não incluímos a parada.

Quando a etapa é None, por padrão, a fatia usa 1para a etapa. Se você pisar com um número inteiro negativo, o Python é inteligente o suficiente para ir do fim ao começo.

>>> myString[::-1]
'0987654321'

Explico detalhadamente a notação de fatia na minha resposta à pergunta Explain notation slice.


8

Você conseguiu isso lá, exceto por "end". É chamado de notação de fatia. Seu exemplo deve ser:

new_sub_string = myString[2:]

Se você deixar de fora o segundo parâmetro, é implicitamente o fim da string.


6

Eu gostaria de acrescentar dois pontos à discussão:

  1. Você pode usar Noneum espaço vazio para especificar "desde o início" ou "até o fim":

    'abcde'[2:None] == 'abcde'[2:] == 'cde'

    Isso é particularmente útil em funções, nas quais você não pode fornecer um espaço vazio como argumento:

    def substring(s, start, end):
        """Remove `start` characters from the beginning and `end` 
        characters from the end of string `s`.
    
        Examples
        --------
        >>> substring('abcde', 0, 3)
        'abc'
        >>> substring('abcde', 1, None)
        'bcde'
        """
        return s[start:end]
  2. Python possui objetos de fatia :

    idx = slice(2, None)
    'abcde'[idx] == 'abcde'[2:] == 'cde'

6

Se myString contiver um número de conta que comece no deslocamento 6 e tenha o comprimento 9, você poderá extrair o número da conta da seguinte maneira: acct = myString[6:][:9] .

Se o OP aceitar isso, eles podem tentar, de maneira experimental,

myString[2:][:999999]

Funciona - nenhum erro é gerado e não ocorre o 'preenchimento de string' padrão.


1
Eu acho que se você quiser usar este método myString[offset:][:length]no caso do OP você pode apenas usarmyString[offset:][:]
victortv

1
@VictorVal A resposta é para aqueles (como eu) que aprenderam Python como uma segunda (3ª, 4ª, ...) linguagem de programação e desejam alguns 'ganchos de sintaxe' familiares para abordar a linguagem. Qualquer especialista no idioma provavelmente verá minha resposta um pouco boba.
precisa

Respostas como essa devem ser sinalizadas para exclusão? Outras respostas explicam muito melhor a solução semelhante, e ver essa me fez coçar a cabeça e procurar o python por alguns minutos antes de perceber que é exatamente esse tipo de resposta.
Sebi

3

Talvez eu tenha perdido, mas não consegui encontrar uma resposta completa nesta página para a (s) pergunta (s) original (ais) porque as variáveis ​​não são discutidas mais aqui. Então eu tive que continuar pesquisando.

Como ainda não tenho permissão para comentar, deixe-me adicionar minha conclusão aqui. Tenho certeza de que não fui o único interessado ao acessar esta página:

 >>>myString = 'Hello World'
 >>>end = 5

 >>>myString[2:end]
 'llo'

Se você deixar a primeira parte, receberá

 >>>myString[:end]
 'Hello' 

E se você deixou o: no meio, também obteve a substring mais simples, que seria o quinto caractere (contagem começando com 0, então fica em branco nesse caso):

 >>>myString[end]
 ' '

1

Bem, eu tive uma situação em que precisava traduzir um script PHP para Python, e ele teve muitos usos substr(string, beginning, LENGTH).
Se eu escolhesse o Python, string[beginning:end]teria que calcular muitos índices finais, portanto, a maneira mais fácil de usar string[beginning:][:length], isso me salvou de muitos problemas.


0

Usar os próprios índices codificados pode ser uma bagunça.

Para evitar isso, o Python oferece um objeto interno slice().

string = "my company has 1000$ on profit, but I lost 500$ gambling."

Se queremos saber quanto dinheiro me resta.

Solução normal:

final = int(string[15:19]) - int(string[43:46])
print(final)
>>>500

Usando fatias:

EARNINGS = slice(15, 19)
LOSSES = slice(43, 46)
final = int(string[EARNINGS]) - int(string[LOSSES])
print(final)
>>>500

Usando fatia você ganha legibilidade.


5
Talvez este não seja o melhor exemplo, porque os índices codificados permanecem e a legibilidade vem de variáveis ​​intermediárias, que você poderia ter usado no primeiro exemplo.
precisa saber é o seguinte
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.