Je fais un filtre dans lequel je vérifie si une chaîne Unicode (codage UTF-8) ne contient aucun caractères majuscules (dans toutes les langues). C'est bon avec moi si la chaîne ne contient pas de caractère moulé du tout.
Par exemple: "Bonjour!" ne passera pas le filtre, mais "!" devrait passer le filtre, car "!" n'est pas un caractère moulé. p>
J'ai prévu d'utiliser la méthode Islower (), mais dans l'exemple ci-dessus, "!". Islower () retournera false. P>
Selon le Python Docs, "La méthode Python Unicode Islower () renvoie true si les caractères de la chaîne de la chaîne Unicode sont tous minuscules et que la chaîne contenait au moins un caractère moulé, sinon, elle renvoie false." P>
Depuis la méthode Retourne False lorsque la chaîne ne contient aucun caractère en chambré, c'est-à-dire. "!", Je veux vérifier si la chaîne contient n'importe quel caractère moulé du tout. P>
quelque chose comme ça .... p> Toute suggestion Pour une fonction contenant_casée ()? p> ou probablement une approche de mise en œuvre différente? p> Merci! P> P>
3 Réponses :
import unicodedata as ud def contains_cased(u): return any(ud.category(c)[0] == 'L' for c in u)
Arg Alex, y a-t-il quelque chose que vous ne savez pas?
+1: Solution de travail (comparée à la belle explication sans code exécutable de John Machin)
Utilisez le module renvoie " ici vous pouvez Trouver la liste des catégories de caractères Unicode p> p> Unicodedata code>,
ll code>" pour les lettres minuscules et "
lu code>" pour les majuscules. p>
ici est le scoop complet sur les catégories de caractères Unicode.
Les catégories de lettres incluent: p> Notez que Vous voudrez peut-être lire la discussion compliquée sur le boîtier, qui inclut une discussion sur Traitement aveuglément Traiter toutes les "lettres" comme cased est manifestement erronée. strong> La catégorie code> lo code> comprend 45301 CODEPOINTS dans le BMP (compté en utilisant Python 2.6). Un gros morceau de ces syllabes, des idéograges CJK et d'autres personnages de l'Est asiatiques - très difficile à comprendre comment ils pourraient être considérés comme "casé". P> Vous aimerez peut-être envisager une définition alternative, basée sur une définition alternative. sur le comportement (non spécifié) des "caractères en chambraille" que vous attendez. Voici une première tentative simple: p> intéressant il y a 1216 x ll et 937 x LU, un total de 2153 ... Poulie d'une enquête plus approfondie sur ce que ll et lu vraiment signent vraiment . p> p> ll <-> Islower () code>; De même pour
lu code>;
(LU ou LT) <-> ISTITLE () CODE> P>
LM code> lettres . P>
@John: wow. Merci pour votre explication. Cela m'a pris un certain temps pour le comprendre. J'ai regardé votre lien et je pense que je dois l'étudier plus largement. J'ai un sentiment que ce que je vais savoir, c'est que je vais me faire réaffirmer beaucoup de mon code. Yikes. Merci!
@Albert: Ne paniquez pas. Comme je l'ai fait allusion, développez d'abord une définition de ce que vous entendez par «cased». Quel traitement différent serez-vous applicable aux caractères en chambrette par opposition aux caractères non sucrés? Mon exemple de définition était "Char qui a un" partenaire "majuscule ou minuscule". Certains (peut-être tous) de la différence entre les caractères de 1970 et le 2153 semblent être dues à des caractères classés comme ll code> car ils ressemblent à un caractère minuscule, mais n'ont pas de
LU CODE> Partenaire, et vice versa - Vous devez décider s'il s'agit de "casé" à vos besoins. BTW Vous pouvez changer votre réponse acceptée :-)
@John: Eh bien, je fais une API pour mon service Web. Mon service WebService accepte une clé qui mesure un enregistrement spécifique dans ma base de données. La clé est sensible à la casse et la clé peut être composée de tout charadière unicode. Afin de normaliser toutes les entrées, je vais convertir toutes les requêtes clés en minuscules (si elles ont des équivalents majuscules). Une conséquence de cela est que lorsque je crée les touches d'enregistrement (que mes utilisateurs peuvent personnaliser), je ne peux accepter aucun caractère majuscule pouvant être converti en un équivalent minuscule par la fonction tolower (). Donc, j'essaie de faire un filtre pour ça. Aucune suggestion?
@Albert: Si vos clés sont sensibles à la casse, pourquoi les normalisez-vous ??? "Les clés d'enregistrement que les utilisateurs peuvent personnaliser" signifie quoi ??? "Tout unicode Char" vs "ne peut accepter aucun caractère majuscule" ??? Pour répondre à votre question littéralement: on dirait que vous ne pouvez pas accepter un caractère C lorsque C.Lower ()! = C code> ce qui signifie que vous ne pouvez pas accepter de clé si
Key.Lower ( )! = clé code>. Je pense que vous devriez commencer une nouvelle question, expliquant exactement ce que vous essayez de faire, avec des exemples. BTW1: N'oubliez pas d'accepter une réponse à cette question en premier. BTW2: Python n'a pas de
Tolower code> Fonction ...
@John: Mon erreur. Je voulais dire la fonction inférieure (). Bon, je vais commencer une nouvelle question. Merci!
@John: Je respecte votre expertise à Unicode. J'ai une nouvelle question, pensez-vous que vous pouvez y jeter un coup d'œil, ainsi que sur les réponses, s'ils sont corrects. Merci!
Vous trompez minuscule lettres i> pour minuscules points de code i>. Ce sont des points de code minuscule mais pas des lettres minuscules: U + 0345 gc = mn code>
alliant ypogegrammeni grec code>, u + 2176
gc = nl code>
Petit chiffre romain sept code>, u + 24da
gc = donc code>
latine cerclée petite lettre k code>. Et celles-ci sont minuscules qui ne changent pas de cas lorsque la majuscule: U + 00aa
gc = ll code>
indicateur ordinal féminin code>, U + 0262
gc = ll code>
Lettre latine Small Capital G Code>, U + 02B0
GC = LM CODE>
Lettre de modificateur Petit H code>, U + 2093
GC = LM Code >
Indice latine petite lettre x code>, u + 210a
gc = ll code>
script petit g code> et u + 1d521
gc = ll Code>
Mathématique Fraktur petit d code>.
La réponse que vous avez acceptée semble être incorrecte. Voir ma réponse.