2 votes

Indexer les chaînes de caractères par lettre, y compris les diacritiques

Je ne sais pas comment formuler cette question, mais je cherche une fonction magique qui rend ce code

for x in magicfunc("Hello world!"):
    print(x)

Comporte-toi comme ça :

H
e
l
l
o

w
o
r
l
d
!

En fait, existe-t-il une fonction ou une méthode unicode intégrée qui prend une chaîne de caractères et produit un tableau par glyphe avec tous les décorateurs unicode respectifs, les signes diacritiques et autres ? De la même manière qu'un éditeur de texte déplace le curseur sur la lettre suivante au lieu d'itérer tous les caractères de combinaison.

Sinon, j'écrirai la fonction moi-même, sans aide. Je me demande juste si elle existe déjà.

1voto

njzk2 Points 17085

Vous pouvez utiliser unicodedata.combining pour savoir si un caractère est combiné :

def combine(s: str) -> Iterable[str]:
  buf = None
  for x in s:
    if unicodedata.combining(x) != 0:
      # combining character
      buf += x
    else:
      if buf is not None:
        yield buf
      buf = x
  if buf is not None:
    yield buf

Résultat :

>>> for x in combine("Hello world!"):
...     print(x)
... 
H
e
l
l
o

w
o
r
l

d
!

Le problème est que COMBINING CYRILLIC MILLIONS SIGN n'est pas reconnu comme combinant, je ne sais pas pourquoi. Vous pouvez également tester si COMBINING est dans le unicodedata.name(x) pour le personnage, cela devrait résoudre le problème.

1voto

Mark Tolonen Points 32702

La troisième partie regex peut effectuer une recherche par glyphe :

>>> import regex
>>> s="Hello world!"
>>> for x in regex.findall(r'\X',s):
...  print(x)
...
H
e
l
l
o

w
o
r
l
d
!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X