Maître de manipulation de chaînes Python

Nous avons résumé les opérations de base sur les chaînes en Python. Ce n'est peut-être pas suffisant pour les personnes expérimentées, mais ...

(Ajout 2018.12.23: La syntaxe de print est rendue compatible avec Python3. Si le code copié et collé dans Python2 ne fonctionne pas, veuillez mettre from __future__ import print_function au début du côté code.)

Chaîne Python = immuable

Les chaînes Python sont immuables, donc même si vous souhaitez les réécrire partiellement, Il sera assemblé en tant que nouvel objet string. Par exemple, une méthode appelée replace qui effectue un remplacement de chaîne retourne un autre objet chaîne avec le contenu après le remplacement.

Mise en relation

Utilisez l'opérateur «+» pour la concaténation.

a = 'Python'
b = '2.7'
c = a + b
print(c)  # => 'Python2.7'

Puisqu'il est traité dans l'ordre, c'est ok même si vous vous connectez beaucoup

a = 'Python'
b = ' is '
c = 'fancy'
print(a + b + c)  # => 'Python is fancy'

Il existe également une technique pour rejoindre en utilisant la méthode join et list / taple. En passant, Ruby join est la méthode Array (qui prend une chaîne concaténée comme argument), et la join de Python est la méthode str (qui prend list / tuple comme argument), donc c'est l'opposé de Ruby. Les personnes expérimentées doivent être prudentes.

strings = ['dog', 'cat', 'penguin']
print(','.join(strings))  #=> 'dog,cat,penguin'

répétition

Si vous répétez le même contenu, donnez un entier avec l'opérateur * et une chaîne de caractères qui se répète le nombre de fois spécifié sera générée.

s = 'dog?'
print(s * 3)  #=> 'dog?dog?dog?'

Intégration de la valeur

Il existe trois façons d'étendre la valeur d'une variable dans une chaîne. Peut-être qu'il y en a d'autres que je ne connais pas.

  1. style sprintf: `` '% s,% s'% ('Bonjour', 'Monde') `
  2. Style de sprintf étendu: `` '% (a) s,% (b) s'% dict (a = 'Hello', b = 'World') `
  3. Utilisez la méthode de format: `` '{0}, {1}'. Format ('Hello', 'World') `

(Note) Je ne suis pas sûr du nom exact du second, mais j'ai décidé de l'appeler le style sprintf étendu sans permission.

style sprintf

Si vous donnez une valeur ou une liste / un tuple à la chaîne avec l'opérateur %, il peut être développé comme suit.

a = 'Python'
b = 'a programming language'
print('%s is %s' % (a, b))  # => 'Python is a programming language'

c = 'World'
print('Hello, %s!' % c)  # => 'Hello, World!'

Vous avez besoin d'autant de valeurs à donner qu'il y a de symboles d'expansion (tels que % s) dans la chaîne. Cela ne peut pas être plus ou moins. S'il y a un symbole d'expansion, la valeur après% n'a pas besoin d'être liste / tuple. (Il est également développé par une liste d'éléments / tuple) Dans l'exemple ci-dessus, la chaîne de caractères du modèle de la première instruction d'impression contient deux symboles d'expansion % s, donc le nombre d'éléments du taple donné par la valeur après% Il y en a également deux. Si vous souhaitez conserver le caractère «%» comme caractère dans la chaîne de caractères du modèle, utilisez «%%» et ** «%» 2 caractères **.

Il existe les spécificateurs de format suivants. Si vous n'êtes pas sûr, il peut être judicieux de le définir sur % s pour le moment. Je voudrais expliquer comment écrire le spécificateur de format sur la page wikipedia de printf.

--% s --Agrandir comme une chaîne --% d - Développé en tant qu'entier --% f --Agrandir comme un nombre décimal

Si vous voulez que le taple ou la liste soit développé comme une chaîne comme `` '(1, 2, 3)' '

tuple_var = (1, 2, 3)
print('tuple_var is: %s' % (tuple_var,))

Si vous ne le faites pas, vous vous fâcherez comme s'il n'y avait qu'un seul espace réservé à remplacer, même s'il y en a trois!

Style sprintf étendu

Spécifiez la clé de l'objet dict entre parenthèses après le «%» de la chaîne de format, et spécifiez l'objet dict sur le côté droit de l'opérateur «%» pour la chaîne de format. Ceci est utile si vous avez déjà une variable dict lors de l'incorporation répétée de la même valeur.

v = dict(first='Michael', family='Jackson')
print('He is %(first)s, %(first)s %(family)s.' % v)

Utilisation de la méthode de format

Vous pouvez utiliser le langage de modèle dédié à la méthode format en utilisant la méthode format.

print('{0}, {1}'.format('Hello', 'World'))  #=> 'Hello, World'

Pour plus de détails, voir Spécification du mini langage de spécification de format.

Remplacer

s = 'Today is Monday.'
ss = s.replace('Monday', 'Sunday')  #=> 'Today is Sunday.'
print(ss)
s2 = 'Hello Hello'
ss2 = s2.replace('Hello', 'Bye')  #=> 'Bye Bye'Si vous ne spécifiez pas le troisième argument, tout sera remplacé
print(ss2)
s3 = 'World World'
ss3 = s3.replace('World', 'Hello', 1)  #=> 'Hello World' #Spécifiez le numéro à remplacer par le troisième numéro
print(ss3)

Utilisez la méthode sub du package re (expression régulière) pour remplacer les chaînes de caractères selon un certain modèle.

import re
s = 'Hello World'
print(re.sub(r"[a-z]", "A", s))  #=> 'HAAAA WAAAA'

Obtenez le Nième personnage

s = 'abc'
n = 1  # 'a'Vouloir
print(s[n-1])  #0 Récupère les caractères à l'index de base

s2 = 'xyz'
print(s[-1])  # 'z'Dernier personnage

Obtenir la sous-chaîne (retirer le caractère M du Nième caractère)

s = "This is a pen."
n = 1
m = 4
print(s[n-1:n-1+m])  # 'This'
print(s[0:4])  # 'This'
print(s[-4:-1])  # 'pen'

Chercher

Utilisez find. Si vous souhaitez effectuer une recherche en arrière, vous pouvez utiliser rfind. find renvoie la position de la chaîne à partir de 0 si la chaîne correspondante est trouvée, ou -1 si elle n'est pas trouvée.

s = 'abcabcabc'
index = s.find('b')  #l'index est 1(2ème caractère)

Vous pouvez spécifier la position de démarrage de la recherche avec le deuxième argument.

s = 'abcabcabc'
index = s.find('b', 2)  #l'index est 4(5ème caractère)

Vous pouvez trouver toutes les cibles dans la chaîne avec le code suivant.

s = 'abcabcabc'
target = 'b'
index = -1
while True:
	index = s.find(target, index + 1)
	if index == -1:
		break
	print('start=%d' % index)

Traitez un caractère à la fois

Puisque le type de chaîne est également un itérateur, il peut être traité avec for comme suit. Si vous voulez une liste de caractères, vous pouvez utiliser list (strvalue).

for c in 'aiueo':
	print(c)

print(list('hoge'))  # => ['h', 'o', 'g', 'e']

Il peut y avoir un moyen d'extraire en se référant aux caractères de l'index.

s = 'aiueo'
for i in range(len(s)):
	c = s[i]
	print(c)

Retirez les blancs aux deux extrémités

Vous pouvez utiliser strip, lstrip et rstrip. strip est une chaîne de caractères avec des espaces, des tabulations et des sauts de ligne (\ r et \ n) supprimés des deux extrémités. lstrip applique le même traitement que strip uniquement à l'extrémité gauche, rstrip renvoie le même traitement que strip appliqué uniquement à l'extrémité droite.

s = ' x '
print('A' + s.strip() + 'B')  # => 'AxB'
print('A' + s.lstrip() + 'B')  # => 'Ax B'
print('A' + s.rstrip() + 'B') # => 'A xB'

Supprimer les sauts de ligne (processus équivalent à chomp of perl ou ruby)

Il semble que vous puissiez utiliser rstrip. Cependant, s'il existe deux modèles avec un espace et un saut de ligne à la fin et que vous souhaitez supprimer uniquement dans le cas d'un saut de ligne, vous devez spécifier le caractère à supprimer dans l'argument.

line = 'hoge\n'
msg = line.rstrip() + 'moge'
print(msg)  # => 'hogemoge'

with open('./test.txt') as fh:
	for line in fh:
		no_line_break_line = line.rstrip()
		#Faire quelque chose


#Supprimer uniquement les sauts de ligne sans supprimer les espaces
line_with_space = 'line \n'  #Je ne veux pas supprimer l'espace avant le saut de ligne
print(line_with_space.rstrip('\n'))  # => 'line '

Faire tout capital

ʻUtiliser la méthode upper () `.

print('hello'.upper())  # => 'HELLO'

Rend le tout plus bas

Utilisez la méthode lower ().

print('BIG'.lower())  # => 'big'

Découvrez si une chaîne est incluse comme sous-chaîne

s = 'abc'
print('b' in s)  #=> True
print('x' in s)  #=> False

Compter le nombre de fois qu'une chaîne apparaît en tant que sous-chaîne

Vous pouvez le faire vous-même en utilisant la méthode find sortie plus tôt, mais il existe une méthode pratique appelée count.

s = 'aaabbc'
print(s.count('b'))  #=> 2

Convertir un entier en chaîne

v = 1
print(str(v))
print('%d' % v)

Convertir float en chaîne

f = 1.234
print(str(f))  #=> '1.234'
print('%f' % f)  #=> '1.234000'

Convertir la liste en chaîne, convertir le tuple en chaîne

Il y a des moments où vous souhaitez l'exprimer sous forme de chaîne de caractères dans une conversion ou une impression de débogage.

v = [1,2,3]
print(str(v))  #=> '[1, 2, 3]'
print('%s' % v)  #=> '[1, 2, 3]'

Si vous essayez d'afficher un tuple avec % s, Python interprétera le tuple donné comme une liste de valeurs pour le modèle et vous obtiendrez une erreur.

v = (1, 2, 3)
print(str(v)) #=> '(1, 2, 3)'Bon exemple
print('%s' % v) #=> '(1, 2, 3)'J'attends, mais j'obtiens une TypeError
print('%s' % (v,)) #=> '(1, 2, 3)'Bon exemple

Il est également bon d'essayer l'assemblage en utilisant join, etc.

v = [1,2,3]
print('<' + ('/'.join([ str(item) for item in v ])) + '>')  #=> '<1/2/3>'

La même chose est vraie pour l'objet tuple.

Convertir dict en chaîne

Il y a des moments où vous souhaitez l'exprimer sous forme de chaîne de caractères dans une conversion ou une impression de débogage.

v = dict(a=1, b=2)
print(str(v))  #=> "{'a': 1, 'b': 2}"
print('%s' % v)  #=> "{'a': 1, 'b': 2}" 

Vous pouvez également utiliser «keys», la notation d'inclusion de liste et «join» pour générer une chaîne de caractères dans une seule ligne.

v = dict(a=1, b=2)
print('<' + ', '.join([ '%s=%s' % (k, v[k]) for k in v.keys() ]) + '>')  #=> '<a=1, b=2>'

Faire des octets une chaîne Unicode

Les données lues à partir d'un fichier ou d'un socket (ouvert en mode binaire) sont une chaîne d'octets en l'état, donc si vous ne l'interprétez pas comme une chaîne de caractères Unicode, vous ne pourrez pas opérer caractère par caractère. Dans la série Python2 (2.7 etc.), str (chaîne d'octets) et unicode (chaîne de caractères) sont distinguées, et il est préférable de traiter la chaîne de caractères comme un objet unicode dans la scène où des caractères multi-octets sont attendus pour une entrée telle qu'une application Web. .. Utilisez la méthode decode () pour interpréter une chaîne d'octets comme une chaîne Unicode avec l'encodage spécifié.

Dans la série Python3, le type str est un type de chaîne de caractères (correspondant au type unicode de la série Python2), et le type bytes est un type de chaîne d'octets (correspondant au type str de la série Python2).

with open('utf8_content_file.txt', 'rb') as fh:  #Mode binaire car c'est rb
	byte_content = fh.read()  #Lis tout,Chaîne d'octets à ce stade
    print len(byte_content)  #Nombre d'octets
    unicode_string = byte_content.decode('utf-8')  # utf-Interprété comme une séquence de caractères avec 8 encodages
    print len(unicode_string)  #nombre de mots

Le codage par défaut de la méthode decode () est ʻutf-8`, donc si vous savez que la chaîne d'octets que vous interprétez est UTF-8, vous pouvez l'omettre.

bytes_data = b'\xe3\x83\x90\xe3\x82\xa4\xe3\x83\x88\xe5\x88\x97'
print(bytes_data.decode())  # => 'Chaîne d'octets'

Les encodages souvent utilisés en japonais sont répertoriés ci-dessous.

--ʻUtf_8 UTF-8 (également connu sous le nom de: ʻutf-8 ʻU8 ʻutf8 cp65001) --shift_jis Shift JIS (Alias: csshiftjis`` shiftjis`` sjis s_jis) --cp932 Shift JIS (Extended Shift JIS) (également appelé: 932`` ms932`` mskanji mks-kanji) --ʻEuc_jp EUC-JP (également appelé ʻeucjp ʻujis ʻu-jis) --ʻIso2022_jpJIS (ISO-2022-JP) (également appelécsiso2022jp ʻiso2022jp ʻiso-2022-jp`)

D'autres encodages pris en charge par Python peuvent être trouvés sur la page du package codecs: https://docs.python.org/ja/3/library/codecs.html

Transformez la chaîne Unicode en octets

Inversement, lors de l'écriture dans un fichier ou un socket (ouvert en mode binaire), la chaîne doit être une chaîne d'octets. Dans ce cas, utilisez la méthode ʻencode () `de l'objet unicode.

unicode_string = u'Chaîne de caractères multi-octets'
with open('./utf8_content_file.txt', 'wb') as fh:  #l'écriture+Ouvrir en mode binaire
    byte_content = unicode_string.encode('utf-8')  # utf-Récupère la chaîne d'octets lorsqu'elle est exprimée en 8 encodages
    fh.write(byte_content)  #Écrire une chaîne d'octets

Si la méthode ʻencode () ne passe pas non plus l'encodage, elle se comporte comme si ʻutf-8 était passé.

str_data = 'Chaîne d'octets'
print(str_data.encode()) # => b'\xe3\x83\x90\xe3\x82\xa4\xe3\x83\x88\xe5\x88\x97'

Utiliser le moteur de modèles

Le moteur de modèles est si riche en fonctionnalités que nous ne couvrirons ici que quelques bibliothèques majeures.

Est-ce que jinja2 est le plus important?

Lien de référence

Recommended Posts

Maître de manipulation de chaînes Python
Manipulation de chaîne en python
Chaîne Python
Manipulation de la date des chaînes en Python
Format de chaîne Python
Manipulation de chaînes de syntaxe Python
tranche de chaîne python
Type de chaîne Python2
Format de chaîne Python
Python # type de chaîne
Inversion de chaîne Python
Manipulation de liste Python
Manipulation de caractères Python Node.js
Manipulation de date en Python
Contraste de manipulation de chaîne Java-Python
[Python2] Chaîne de date → UnixTime → Chaîne de date
Génération de chaînes aléatoires (Python)
Python3> chaîne de documentation / docstring
Illustration de traitement de chaîne Python
Manipulation de chaînes avec python et pandas que j'utilise souvent
Aim Python Library Master (48) Autopep8
Aim Python Library Master (36) json2html
Aim Python Library Master (49) psidialogs
Aim Python Library Master (26) easyxml
Aim python library master (29) table_printer
Espaces de noms Aim Python Library Master (55)
AIM Python Library Master (46) BrowserPlus
[python] Convertir la date en chaîne
Aim Python Library Master (30) Chronyk
Indentation Python et format de chaîne
AIM Python Library Master (3) Workalendar
Aim Python Library Master (37) Slimurl
Aim Python Library Master (44) pynetviz
Aim Python Library Master (8) Rolex
Aim Python Library Master (52) Marktime
Aim Python Library Master (7) Numparser
Méthodes d'objet chaîne en Python
Aim Python Library Master (21) hy
Viser les requêtes du maître de bibliothèque python (18)
[Python] Utiliser une séquence de chaînes
Aim Python Library Master (13) Easydev
Aim Python Library Master (20) Pyyaml
Aim Python Library Master (34) simultané
Viser la segmentation de mots du maître de la bibliothèque python
Aim Python Library Master (43) cpmoptimize
Aim Python Library Master (68) pazudorasolver
Aim Python Library Master (58) Faker
Aim Python Library Master (11) nlist
Aimez le maître de la bibliothèque python (38) beautiful_print
Diverses opérations de chaîne avec Python intégré
Aim Python Library Master (65) Geopy
Aim Python Library Master (2) Vincenty
Journal de bord Aim Python Library Master (59)
Aim Python Library Master (51) Pyautogui
Aim Python Library Master (10) Timeit
Aim Python Library Master (0) Liens
Aim Python Library Master (66) youtube-dl
Aim Python Library Master (53) psutil
Aim Python Library Master (22) HTMltag