Chaînes de caractères - str

Les chaînes de caractères - type str pour strings - servent à représenter les textes.

  • Une chaîne se reconnaît par l’utilisation de délimiteurs:
    • guillemets simples: 'permet les guillemets "doubles"' ou
    • guillemets doubles: "permet les guillemets 'simples'".
  • Chaque caractère d’une chaîne est numéroté par un entier (positif ou négatif) appelé position ou index:
    • Le premier caractère a la position 0, le second la position 1, etc.
    • Le dernier caractère a la position -1, l’avant dernier -2, etc.
  • La longueur d’une chaîne est le nombre de caractères qu’elle contient.
  • Caractères «spéciaux»: Saut de ligne - \n ; tabulation (touche Tab) - \t ; insérer un backslash \\; ou un délimiteur - \' ou \".
  • Insérer un caractère non accessible au clavier: on insère son «point de code» unicode via \u<code><code> doit être remplacé par la valeur adéquate (voir ce site). Par exemple, \u265E devrait donner un cavalier : .
  • Obtenir la documentation en ligne : help(str) (taper «q» pour finir)

Opérations de base

  • Créer une chaîne littéralement - '...' ou "...":

    >>> ch = "bonjour \u262F \n tout l'monde!"
    >>> ch # contenu de ch, notez les guillemets.
    "bonjour ☯  \n tout l'monde!"
    >>> print(ch) # affichage à l'écran de ch1, différence ?
    bonjour ☯
     tout l'monde!
    >>> autreDelim = 'bonjour \u262F \n tout l\'monde!'
    >>> ch == autreDelim
    True
    
  • Connaître le nombre de caractères qu’elle contient - len(chaine):

    >>> long = len(ch)
    >>> long
    24
    
  • Savoir si une sous-chaîne ou un caractère apparaît dans la chaîne - ss_chaine in chaine:

    >>> ch
    "bonjour ☯ \n tout l'monde!"
    >>> " " in ch # l'espace est un caractère comme un autre ...
    True
    >>> "z" in ch
    False
    >>> "Jour" in ch # attention à la «casse» (majuscule/minuscule)
    False
    >>> "jour" in ch
    True
    
  • Accéder à un caractère - chaine[pos]:

    >>> ch
    "bonjour ☯ \n tout l'monde!"
    >>> ch[0]
    'b'
    >>> # Quelle est la position positive du symbole ☯  ?
    >>> ch[-1]
    '!'
    >>> # Quelle est sa position négative ?
    
  • Extraire une sous-chaîne - chaine[pos1:pos2] ou chaine[pos1:pos2:pas]:

    >>> ch
    "bonjour ☯ \n tout l'monde!"
    >>> ch[1:4] # Attention [pos1:pos2] = de pos1 inclus jusqu'à pos2 exclus !
    'onj'
    >>> ch[4:] # pos2 omis = jusqu'à la fin
    "our ☯ \n tout l'monde!"
    >>> ch[:10] # pos1 omis = depuis le début
    'bonjour ☯ '
    >>> ch[:10:2] # extraire pos 0, 2, 4, 6, 8 (10 exclus)
    'bnor☯'
    
  • Concaténer deux chaînes ou plus - ch1 + ch2 + ...:

    >>> "ab" + 'cd'
    'abcd'
    >>> ch = "Spaghetti"
    >>> ch = ch + " carbonara" + '.'
    >>> ch
    'spaghetti carbonara.'
    
  • Découper une chaîne relativement à un caractère de séparation - str.split([sep]):

    >>> "un deux    trois\nquatre  ".split() # si sep est omis, le découpage se fait sur les espaces ou les sauts de lignes
    ['un', 'deux', 'trois', 'quatre']
    >>> ch = 'un,2,,3, quatre'
    >>> ch.split(',') # Notez les petites différences dans le cas où sep est précisé
    ['un', '2', '', '3', ' quatre']
    

Parcourt d’une chaîne

  • Direct - for car in chaine::

    >>> ch = "huit"
    >>> for c in ch:
    ...     print(c)
    ...
    h
    u
    i
    t
    >>> res = ''
    >>> for c in ch:
    ...     print("res='" + res + "' et c='" + c + "' donc res=c+res ???")
    ...     res = c + res
    ...
    res='' et c='h' donc res=c+res ???
    res='h' et c='u' donc res=c+res ???
    res='uh' et c='i' donc res=c+res ???
    res='iuh' et c='t' donc res=c+res ???
    >>> res
    'tuih'
    
  • Par énumération - for pos, car in enumerate(chaine)::

    >>> ch = "du feu"
    >>> for p, c in enumerate(ch):
    ...     print("ch[" + str(p) + "]=" + c)
    ...
    ch[0]=d
    ch[1]=u
    ch[2]=
    ch[3]=f
    ch[4]=e
    ch[5]=u
    
  • Indirect: par les positions dans la chaîne - for pos in range(len(chaine))::

    >>> ch = "du feu"
    >>> str(5) # conversion d'un entier en chaîne
    '5'
    >>> # Note: range(nb) -> 0, 1, 2, 3, ..., nb - 1
    >>> # or pos dans chaîne -> 0, 1, 2, ..., len(ch) - 1 !!!
    >>> # donc range(len(ch)) -> positions possibles dans chaîne
    >>> for i in range(len(ch)):
    ...     print("ch[" + str(i) + "]=" + ch[i])
    ...
    ch[0]=d
    ch[1]=u
    ch[2]=
    ch[3]=f
    ch[4]=e
    ch[5]=u
    
  • à l’envers - for car in reversed(chaine)::

    >>> ch = "bonjour"
    >>> for c in reversed(ch):
    ...     print(c, end="")
    ...
    ruojnob
    

Autres opérations utiles

  • Majuscule/minuscule - str.upper(), .lower(), .swapcase() et .capitalize():

    >>> "Bonjour".upper()
    'BONJOUR'
    >>> "PaS PossiBLE".lower()
    'pas possible'
    >>> 'PaS PossiBLE'.swapcase()
    'pAs pOSSIble'
    >>> 'auReVoir'.capitalize()
    'Aurevoir'
    
  • Formatage - str.format():

    >>> # Les «{}» sont remplacés par les valeurs correspondantes
    >>> ville = 'Bruxelle'
    >>> '{} est la capitale de la {}.'.format(ville, 'Belgique')
    'Bruxelle est la capitale de la Belgique.'
    >>> piece, pos = "cavalier", (3, 5)
    >>> "La position du {a} est ligne {b[0]} colonne {b[1]}.".format(a=piece, b=pos)
    'La position du cavalier est ligne 3 colonne 5.'
    >>> conv = "En binaire {a}={a:b} et en hexadécimal {a}={a:x}."
    >>> conv = conv.format(a=43)
    >>> print(conv)
    En binaire 43=101011 et en hexadécimal 43=2b.
    
  • Chaînes multilignes - '''...''' ou """....""":

    >>> discours = '''Bonjour chers amis,
    ...
    ...     Je tenais tout particulièrement à
    ... vous remercier pour blah blah blah ...
    ...
    ... Sincèrement ...'''
    >>> discours
    'Bonjour chers amis,\n\n   Je tenais tout particulièrement à\nvous remercier pour blah blah blah ...\n\nSincèrement ...'
    >>> print(discours)
    Bonjour chers amis,
    
        Je tenais tout particulièrement à
    vous remercier pour blah blah blah ...
    
    Sincèrement ...
    
  • Joindre les chaînes d’une «séquence» - str.join(seq):

    >>> '; '.join(['a', 'b'])
    'a; b'
    >>> l = ["un", "deux", "trois"]
    >>> sep = ' puis '
    >>> sep.join(l)
    'un puis deux puis trois'
    
  • Encoder pour communiquer - str.encode() et bytes.decode():

    Python3 représente chaque caractère d’une chaîne par son identifiant unicode. Cela permet, virtuellement, de représenter toutes les langues du monde (ou presque). Pour connaître cet identifiant, utiliser ord(car). Inversement, pour trouver un caractère d’identifiant id, utiliser chr(id).

    Lorsqu’on veut, par exemple, envoyer un message comme 'bonjour' sur un réseau, il est en pratique nécessaire d’encoder le message (par défaut en Utf-8) de manière à le représenter (en interne) comme une chaîne d’octets ou bytes (regroupement de 8 bits - 0 ou 1). Pour en savoir plus ....

    >>> ch = 'aïe' # chaîne de caractères
    >>> # encodage en un bytes (chaîne d'octets) via Utf-8
    >>> chEnc = mess.encode('utf-8')
    >>> type(chEnc) # chaîne d'octet
    <class 'bytes'>
    >>> chEnc # le préfixe «b» précise qu'il s'agit d'un bytes
    b'a\xc3\xafe'
    >>> for car in ch: # parcourt de la chaîne de caractères
    ...    print(ord(car), end=' ') # ord(caractère): identifiant unicode (en décimal)
    ...
    97 239 101
    >>> for octet in chEnc: # parcourt de la chaîne d'octets
    ...    print(octet, end=' ') # chaque octet correspond à un entier de [0,256[
    97 195 175 101
    >>> # notez que le 'ï' est codé sur 2 octets en Utf-8 !
    >>> # pour décoder un bytes c'est à dire retrouver la chaîne de caractères correspondante
    >>> message = chEnc.decode('utf-8')
    >>> message
    'aïe'
    
  • Récupérer la liste des lignes - str.splitlines():

    >>> texte = "un\ndeux\ntrois"
    >>> print(texte)
    un
    deux
    trois
    >>> lignes = texte.splitlines()
    >>> lignes
    ['un', 'deux', 'trois']