|
|
@@ -1,7 +1,11 @@ |
|
|
|
import unicodedata |
|
|
|
|
|
|
|
import regex # pour le support de "\p{}" |
|
|
|
|
|
|
|
# ESPACE_FINE_INSECABLE = unicodedata.lookup("NARROW NO-BREAK SPACE") |
|
|
|
# ESPACE_INSECABLE = unicodedata.lookup("NO-BREAK SPACE") |
|
|
|
# Pour distinguer dans le HTML produit plus facilement. |
|
|
|
ESPACE_FINE_INSECABLE = " " |
|
|
|
ESPACE_INSECABLE = " " |
|
|
|
|
|
|
|
|
|
|
|
def assemble_regexes(*regexes): |
|
|
|
return "|".join(regexes) |
|
|
@@ -10,22 +14,24 @@ def assemble_regexes(*regexes): |
|
|
|
def build_regex(avant, apres): |
|
|
|
# \p{} permet de reconnaître un caractère par sa catégorie Unicode |
|
|
|
# "Zs" est la catégorie "Separator, space". |
|
|
|
return rf"((?P<avant>{avant})" + r"\p{Zs}" + rf"(?P<apres>{apres}))" |
|
|
|
return ( |
|
|
|
rf"((?P<avant>{avant})" |
|
|
|
+ rf"(\p{{Zs}}|{ESPACE_INSECABLE})" |
|
|
|
+ rf"(?P<apres>{apres}))" |
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
RE_ESPACE_FINE_INSECABLE = regex.compile( |
|
|
|
assemble_regexes( |
|
|
|
build_regex(r"\w?", r"[;\?!]"), # Ponctuations doubles. |
|
|
|
build_regex(r"\d", r"([ghj]|mg|°C)(\b|$)"), # Unités. |
|
|
|
build_regex(r"\d", r"(Mo|Ko|Go|Mb|Kb|Gb)(\b|$)"), # Tailles de fichiers. |
|
|
|
build_regex(r"\d", r"%"), # Pourcentages. |
|
|
|
build_regex(r"\d", r"€"), # Symboles monétaires. |
|
|
|
build_regex(r"\d", r"\d"), # Séparateurs de milliers. |
|
|
|
) |
|
|
|
) |
|
|
|
|
|
|
|
ESPACE_FINE_INSECABLE = unicodedata.lookup("NARROW NO-BREAK SPACE") |
|
|
|
ESPACE_FINE_INSECABLE = " " |
|
|
|
|
|
|
|
|
|
|
|
def insere_espaces_fines_insecables(texte): |
|
|
|
return RE_ESPACE_FINE_INSECABLE.sub( |
|
|
@@ -40,14 +46,11 @@ RE_ESPACE_INSECABLE = regex.compile( |
|
|
|
# "Po" est la catégorie "Punctuation, other". |
|
|
|
build_regex(r"[\w\p{Po}]?", r"»"), # Guillemets en chevrons. |
|
|
|
build_regex(r"\d", r"(?!\d)\w"), # Chiffre suivi de lettres. |
|
|
|
build_regex(r"(M\.|Mme)", r"\w"), # Titres (Monsieur, Madame). |
|
|
|
) |
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
ESPACE_INSECABLE = unicodedata.lookup("NO-BREAK SPACE") |
|
|
|
ESPACE_INSECABLE = " " |
|
|
|
|
|
|
|
|
|
|
|
def insere_espaces_insecables(texte): |
|
|
|
return RE_ESPACE_INSECABLE.sub( |
|
|
|
r"\g<avant>" + ESPACE_INSECABLE + r"\g<apres>", texte |