web-dev-qa-db-fra.com

Est-il possible de sous-chaîne une chaîne?

Y at-il un moyen de sous-chaîne d'une chaîne en Python, pour obtenir une nouvelle chaîne du 3ème caractère à la fin de la chaîne?

Peut-être que vous aimez myString[2:end]?

Si quitter la deuxième partie signifie «jusqu'au bout», si vous quittez la première partie, est-ce que cela commence au début?

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

Python appelle ce concept "slicing" et fonctionne sur plus que de simples chaînes. Jetez un coup d'oeil ici pour une introduction complète.

2671
Paolo Bergantino

Juste pour être complet, personne d'autre n'en a parlé. Le troisième paramètre d'une tranche de tableau est une étape. Donc, inverser une chaîne est aussi simple que:

some_string[::-1]

Ou choisir des personnages alternatifs serait:

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

La possibilité d'avancer et de revenir en arrière dans la chaîne maintient la cohérence avec la possibilité de découper un tableau à partir du début ou de la fin.

327
Endophage

Substr () normalement (c'est-à-dire PHP et Perl) fonctionne comme suit: 

s = Substr(s, beginning, LENGTH)

Donc, les paramètres sont beginning et LENGTH.

Mais le comportement de Python est différent. il attend un début et un après FIN (!). Ceci est difficile à repérer par les débutants. Donc le remplacement correct pour Substr (s, début, LENGTH) est

s = s[ beginning : beginning + LENGTH]
102
Michał Leon

Un moyen courant d’atteindre cet objectif est le découpage en chaîne. 

MyString[a:b] vous donne une sous-chaîne de l'index a à (b - 1).

47
codingscientist

Un exemple semble manquer ici: une copie complète (peu profonde).

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

Ceci est un langage courant pour créer une copie des types de séquence (pas des chaînes internées), [:]. Peu de copies d'une liste, voir La syntaxe de tranche de liste Python utilisée sans raison évidente.

17
gimel

Y at-il un moyen de sous-chaîne d'une chaîne en Python, pour obtenir une nouvelle chaîne du 3ème caractère à la fin de la chaîne?

Peut-être que vous aimez myString[2:end]?

Oui, cela fonctionne si vous attribuez, ou bind , le nom, end, au singleton constant, None:

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

La notation slice a 3 arguments importants:

  • début
  • arrêtez
  • étape

Leurs valeurs par défaut quand elles ne sont pas données sont None - mais nous pouvons les passer explicitement:

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

Si quitter la deuxième partie signifie «jusqu'au bout», si vous quittez la première partie, est-ce que cela commence au début?

Oui, par exemple:

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

Notez que nous incluons start dans la tranche, mais que nous ne montons que jusqu'à stop.

Lorsque step vaut None, la tranche utilise par défaut 1 pour l'étape. Si vous utilisez un nombre entier négatif, Python est suffisamment intelligent pour aller de la fin au début.

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

J'explique la notation de tranche de manière très détaillée dans ma réponse à Explain la question de la notation de tranche.

17
Aaron Hall

Vous l'avez là-bas, sauf pour "fin". C'est ce qu'on appelle la notation slice. Votre exemple devrait se lire comme suit:

new_sub_string = myString[2:]

Si vous omettez le deuxième paramètre, il s'agit implicitement de la fin de la chaîne.

8
bouvard

J'aimerais ajouter deux points à la discussion:

  1. Vous pouvez utiliser None à la place sur un espace vide pour spécifier "depuis le début" ou "jusqu'à la fin":

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

    Ceci est particulièrement utile dans les fonctions où vous ne pouvez pas fournir d'argument vide:

    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 a slice objets:

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

C'est assez simple:

s = 'Hello, World!'
print(s[:]) # prints "Hello, World!"
print(s[:5]) # prints Hello
print(s[5:]) # prints , World!
print(s[3:7]) # prints "lo, "
4
Muskovets

J'ai peut-être manqué cela, mais je ne pouvais pas trouver une réponse complète aux questions d'origine sur cette page, car les variables ne sont pas traitées plus en détail ici. Je devais donc continuer à chercher.

Comme je ne suis pas encore autorisé à commenter, laissez-moi ajouter ma conclusion ici. Je suis sûr que je n’étais pas le seul à y être intéressé en accédant à cette page: 

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

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

Si vous quittez la première partie, vous obtenez 

 >>>myString[:end]
 'Hello' 

Et si vous avez laissé le: au milieu aussi, vous avez la sous-chaîne la plus simple, qui serait le 5ème caractère (le nombre commençant par 0, c'est donc le blanc dans ce cas):

 >>>myString[end]
 ' '
3
Rudi Uhl

L'utilisation d'index codés en dur peut être un désordre.

Pour éviter cela, Python propose un objet intégré slice().

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

Si nous voulons savoir combien d'argent il me reste.

Solution normale:

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

En utilisant des tranches:

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

En utilisant slice, vous gagnez en lisibilité.

0
levi

Basé sur la réponse @CopyPastelt, si vous voulez une sous-chaîne basée sur l'offset et la longueur:

def substring(s, offset=None, length=None):
    return s[offset:][:length]

Exemple d'utilisation:

string = 'Hello Beautiful World'
substring(string) #returns 'Hello Beautiful World'
substring(string,length=5) #returns 'Hello'
substring(string,6,9) #returns 'Beautiful'
substring(string,16) #returns 'World'
0
Victor Val

Si myString contient un numéro de compte commençant par l'offset 6 et ayant une longueur de 9. Ensuite, vous pouvez extraire le numéro de compte de cette façon: acct = myString[6:][:9].

Si le PO accepte cela, il pourrait vouloir essayer, de manière expérimentale,

myString[2:][:999999]

Cela fonctionne - aucune erreur n'est déclenchée et aucun «remplissage de chaîne» par défaut ne se produit.

0
CopyPasteIt