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.)
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.
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'
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?'
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.
(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.
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!
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)
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.
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'
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
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'
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)
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)
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'
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 '
ʻUtiliser la méthode upper () `.
print('hello'.upper()) # => 'HELLO'
Utilisez la méthode lower ()
.
print('BIG'.lower()) # => 'big'
s = 'abc'
print('b' in s) #=> True
print('x' in s) #=> False
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
v = 1
print(str(v))
print('%d' % v)
f = 1.234
print(str(f)) #=> '1.234'
print('%f' % f) #=> '1.234000'
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
.
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>'
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
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'
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?
Recommended Posts