Python >> Tutoriel Python >  >> Python

Vérifier si tous les caractères d'une chaîne sont en majuscules

Formulation du problème : Comment vérifier si tous les caractères d'une chaîne sont en majuscule ?

Contexte :Une chaîne est une séquence de caractères et fait partie des types de données les plus couramment utilisés et les plus populaires en Python. Les chaînes peuvent être entourées de guillemets simples ou doubles et sont "immuables", ce qui signifie qu'elles ne peuvent pas être modifiées une fois créées. Il existe différentes méthodes que nous pouvons passer sur une chaîne, et dans cet article, nous allons nous concentrer sur une en particulier :vérifier si tous les caractères d'une chaîne sont en majuscules.

Exemple :Pour commencer, créons deux exemples de chaînes en Python :

example_1 = 'Hello, my name is Rikesh!'
example_2 = 'HELLO, MY NAME IS RIK@SH48!!'

Comme vous pouvez le voir, nous avons couvert tous nos caractères ici - majuscules, minuscules, puis certains caractères spéciaux et chiffres également.

Méthode 1 :isupper()

Il s'agit d'une méthode intégrée de chaîne utilisée pour la gestion des chaînes en Python et renvoie une valeur booléenne - True si tous les caractères sont en majuscule ou False sinon.

Passons nos exemples à travers cette méthode et voyons ce que nous obtenons en sortie :

>>> example_1.isupper()
False

Bien que notre chaîne contienne un 'H' et un 'R' majuscules, le retour est faux car TOUS les caractères ne sont pas en majuscules. Essayons maintenant avec notre example_2 :

>>> example_2.isupper()
True

Même si nous avons des caractères spéciaux et des chiffres, le retour est True car tous nos caractères sont bien en majuscules. Cette méthode renvoie True pour les espaces, les chiffres et les symboles, seules les lettres minuscules renvoient False .

Méthode 2 :Regex correspond uniquement aux majuscules

regex de Python ou re module nous permet de rechercher et de faire correspondre notre chaîne Python caractère par caractère. La façon dont regex définit les caractères est légèrement différente, car elle utilise ASCII au lieu d'Unicode. Bien que cela ne fasse aucune différence pratique pour notre chaîne, cela change la façon dont regex recherche car il classe les caractères alphabétiques différemment des chiffres et autres caractères spéciaux.

Il existe deux façons d'utiliser le module regex pour vérifier les caractères majuscules. Ensuite, nous explorons le premier.

Une fois importé, nous pouvons utiliser regex pour vérifier notre chaîne et rechercher uniquement les correspondances en majuscules. Dans le code ci-dessous, le [A-Z] jeu de caractères limite nos critères de correspondance aux caractères alphabétiques en majuscules (majuscules) uniquement, dans la plage de A à Z. Le $ garantit que nous recherchons jusqu'à la fin de la chaîne. Comme nous voulons juste savoir si la chaîne est entièrement en majuscule ou non, nous pouvons spécifier le retour sous forme de valeur booléenne :

import re
example_1 = 'Hello, my name is Rikesh!'
res = bool(re.match(r'[A-Z]+$', example_1))
print(res)
# False

Cela ne devrait pas être une surprise car notre chaîne contient clairement un mélange de caractères majuscules et minuscules.

import re
res=bool(re.match(r'[A-Z]+$', example_2))
example_2 = ‘HELLO, MY NAME IS RIK@SH48!!’
print(res)
# False

D'accord, celui-ci n'est probablement pas ce à quoi vous vous attendiez. Ce n'est certainement pas ce à quoi je m'attendais! Tous nos caractères sont clairement en majuscules, alors que s'est-il passé ? Fondamentalement, regex a reconnu que notre chaîne contient des caractères spéciaux ('@', '!!' et ',') ainsi que des chiffres (48). Comme ceux-ci sont considérés comme des classes différentes, ils ne sont pas dans la plage A-Z majuscule, il a donc renvoyé False. N'oubliez pas que nous avons demandé à regex de faire correspondre la chaîne contenant UNIQUEMENT des caractères alphabétiques majuscules.

Si nous essayons maintenant la même fonction sur une chaîne contenant uniquement des caractères alphabétiques majuscules, sans caractères spéciaux ni chiffres, nous obtenons le résultat suivant :

import re

example_3 = 'HELLO MY NAME IS RIKESH'
res = bool(re.match(r'[A-Z]+$', example_3))
print(res)
# False

Même cela ne fonctionne pas ! Malheureusement, regex n'ignore pas les espaces blancs par défaut, ce qui signifie que cette fonction ne serait applicable que si nous étions sûrs que notre chaîne d'origine ne contenait pas de caractères spéciaux, de chiffres ou même d'espaces blancs. Adapter la fonction serait, j'en suis sûr, possible, mais cela semble trop compliqué lorsque nous avons une solution beaucoup plus simple.

Méthode 3 :Regex n'importe quelle minuscule

Nous pouvons utiliser la façon dont regex définit les caractères à notre avantage, en travaillant plutôt avec des caractères minuscules. La logique étant que s'il y a un caractère minuscule dans notre chaîne, tous les caractères ne sont pas en majuscule. Cela rendrait le problème avec les caractères spéciaux, les chiffres et les espaces obsolètes - en supposant bien sûr que vous ne vouliez pas que cela affecte le résultat. Pour les besoins de cet article, nous supposerons que notre objectif est de nous assurer que tous les caractères de notre chaîne sont des caractères alphabétiques majuscules, plutôt que des caractères alphabétiques minuscules.

La façon dont nous pouvons vérifier si TOUT caractère alphabétique dans notre chaîne est en minuscule avec regex est la suivante :

import re
example_1 = 'Hello, my name is Rikesh!'
res=bool(re.match(r'\w*[a-z]\w*', example_1))
print(res)
# True

Rappelez-vous, nous recherchons maintenant des caractères minuscules, donc même si nous avons un mélange de majuscules et minuscules dans cet exemple, le retour est True c'est-à-dire que la chaîne contient des minuscules et n'a donc pas que des caractères majuscules.

import re
example_2 = 'HELLO, MY NAME IS RIK@SH48!!'
res=bool(re.match(r'\w*[a-z]\w*', example_2))
print(res)
# False

Même si notre chaîne contient des caractères spéciaux, des chiffres et des espaces, le retour est False car il ne contient pas de caractères alphabétiques minuscules. Tous les caractères sont en majuscules.

Méthode 4 :ASCII et any()

La bibliothèque de chaînes contient des fonctions spécifiquement pour le traitement des chaînes Python, et nous pouvons l'utiliser pour rechercher notre chaîne en fonction du caractère ASCII, que nous venons d'aborder.

Comme nous l'avons vu précédemment avec regex, à moins que nous ne soyons sûrs que votre chaîne d'origine ne contienne pas de chiffres, de caractères spéciaux ou même d'espaces blancs, la recherche selon que tous les caractères sont en majuscules peut être problématique. Dans les cas où nous ne pouvons pas être sûrs que notre chaîne ne contient que des caractères alphabétiques, nous pouvons à nouveau utiliser notre méthode de «vérification inversée» - si la chaîne contient des caractères minuscules, nous savons que tous les caractères ne sont pas en majuscules. Le string.ascii_lowercase fonction nous aidera à le faire.

Nous pouvons utiliser le any() méthode pour vérifier si des caractères de la chaîne contiennent la propriété que nous recherchons :

import string
example_1 = 'Hello, my name is Rikesh!'
res = any(s in string.ascii_lowercase for s in example_1)
print(res)
# True

Comme nous avons un mélange de caractères alphabétiques majuscules et minuscules, la fonction a renvoyé True , rappelez-vous encore une fois que nous vous demandons si tout les caractères sont en minuscules.

import string
example_2 = 'HELLO, MY NAME IS RIK@SH48!!'
res = any(s in string.ascii_lowercase for s in example_2)
print(res)
# False

Tous nos caractères alphabétiques dans cet exemple sont en majuscules, donc la fonction a renvoyé False il n'y a pas de caractères minuscules. Les caractères spéciaux et les chiffres ont été ignorés.

Valeurs ASCII

Cette méthode a été abandonnée pour une bonne raison, car je pense que c'est la plus compliquée de toutes. La méthode est basée sur le fait que tous nos caractères ASCII ont une valeur correspondante, nous pouvons donc vérifier si nos caractères sont en majuscules en fonction de leurs valeurs correspondantes. Par exemple, les valeurs ASCII pour les lettres majuscules vont de 65 à 90 inclus et pour les lettres minuscules de 97 à 122 inclus.

Si nous devions vérifier si tous les caractères sont en majuscules, nous aurions le problème que nous avons rencontré auparavant avec les caractères spéciaux et numériques. Nous pourrions cependant utiliser la logique des minuscules - s'il y a un caractère minuscule, ils ne peuvent pas tous être en majuscule. Pour obtenir la valeur ASCII du caractère, nous devons utiliser le ord() fonction :

Testons-le pour voir :

>>> ord('A')
65
>>> ord('a')
97

Nous pouvons donc maintenant vérifier si l'un des caractères de notre chaîne se situe dans la plage des minuscules (97-122), juste pour réitérer si nous utilisions la plage des majuscules, cela signalerait non seulement les caractères minuscules, mais aussi les caractères spéciaux et les chiffres.

example_1 = 'Hello, my name is Rikesh!'
res=any(ord(s)>=97 and ord(s)<=122 for s in example_1)
print(res)
# True

example_2 = 'HELLO, MY NAME IS RIK@SH48!!'
res=any(ord(s)>=97 and ord(s)<=122 for s in example_2)
print(res)
# False

Comme nous pouvons le voir dans nos exemples, notre example_1 contient des caractères alphabétiques minuscules, nous avons donc obtenu un True revenir. Malgré le fait, notre example_2 contient des caractères spéciaux et des chiffres, nous avons obtenu un False retour car il n'y a pas de caractères minuscules.

Résumé

Le but de cet article était d'examiner les méthodes permettant de vérifier si tous les caractères d'une chaîne sont en majuscules. Si tel est notre objectif principal, le isupper() La méthode semble être la plus simple, principalement parce qu'elle se concentre uniquement sur les caractères alphabétiques et ignore tout le reste - chiffres, caractères spéciaux et espaces blancs.

Alors que les autres méthodes peuvent être plus ciblées, leur utilité dépend vraiment de la façon dont nous voulons définir nos « caractères » et de ce que nous essayons de réaliser. Étant donné que nous voulons nous concentrer uniquement sur la garantie que nos caractères alphabétiques sont en majuscules plutôt qu'en minuscules, ils ont une utilité limitée et peuvent fournir des résultats trompeurs. Comme nous l'avons vu, nous pouvons contourner ce problème en adaptant nos critères de recherche pour nous concentrer uniquement sur l'identification des caractères alphabétiques minuscules. Cela semble être le contraire de ce que nous essayons de réaliser, nous devons donc nous assurer que nous interprétons notre True et False résultats correctement.

Tout bien considéré, il est cependant difficile de trouver une raison de ne pas utiliser le isupper() méthode.