8
votes

Python: Comment vérifier si une chaîne Unicode contient un caractère moulé?

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é.

J'ai prévu d'utiliser la méthode Islower (), mais dans l'exemple ci-dessus, "!". Islower () retournera false.

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."

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.

quelque chose comme ça .... xxx

Toute suggestion Pour une fonction contenant_casée ()?

ou probablement une approche de mise en œuvre différente?

Merci!


1 commentaires

La réponse que vous avez acceptée semble être incorrecte. Voir ma réponse.


3 Réponses :


8
votes
import unicodedata as ud

def contains_cased(u):
  return any(ud.category(c)[0] == 'L' for c in u)

2 commentaires

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)



1
votes

Utilisez le module Unicodedata , xxx

renvoie " ll " pour les lettres minuscules et " lu " pour les majuscules.

ici vous pouvez Trouver la liste des catégories de caractères Unicode


0 commentaires

8
votes

ici est le scoop complet sur les catégories de caractères Unicode.

Les catégories de lettres incluent: xxx

Notez que ll <-> Islower () ; De même pour lu ; (LU ou LT) <-> ISTITLE ()

Vous voudrez peut-être lire la discussion compliquée sur le boîtier, qui inclut une discussion sur LM lettres .

Traitement aveuglément Traiter toutes les "lettres" comme cased est manifestement erronée. La catégorie lo 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é".

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: xxx

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 .


7 commentaires

@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 car ils ressemblent à un caractère minuscule, mais n'ont pas de LU 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 ce qui signifie que vous ne pouvez pas accepter de clé si Key.Lower ( )! = clé . 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 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 pour minuscules points de code . Ce sont des points de code minuscule mais pas des lettres minuscules: U + 0345 gc = mn alliant ypogegrammeni grec , u + 2176 gc = nl Petit chiffre romain sept , u + 24da gc = donc latine cerclée petite lettre k . Et celles-ci sont minuscules qui ne changent pas de cas lorsque la majuscule: U + 00aa gc = ll indicateur ordinal féminin , U + 0262 gc = ll Lettre latine Small Capital G , U + 02B0 GC = LM Lettre de modificateur Petit H , U + 2093 GC = LM Indice latine petite lettre x , u + 210a gc = ll script petit g et u + 1d521 gc = ll Mathématique Fraktur petit d .