Python traite \ uxxxx comme un caractère unicode qui s'échappe à l'intérieur d'un littéral de chaîne (par exemple, "u \ u2014" est interprété comme un caractère Unicode U + 2014). Mais je viens de découvrir (Python 2.7) que le module regex standard ne traite pas \ uxxxx comme un caractère Unicode. Exemple:Est-ce que python re (regex) a une alternative aux séquences d'échappement Unicode?
codepoint = 2014 # Say I got this dynamically from somewhere
test = u"This string ends with \u2014"
pattern = r"\u%s$" % codepoint
assert(pattern[-5:] == "2014$") # Ends with an escape sequence for U+2014
assert(re.search(pattern, test) != None) # Failure -- No match (bad)
assert(re.search(pattern, "u2014")!= None) # Success -- This matches (bad)
Il est évident que si vous êtes en mesure de préciser votre modèle de regex comme une chaîne littérale, alors vous pouvez avoir le même effet que si le moteur regex se comprend \ uxxxx échappe:
test = u"This string ends with \u2014"
pattern = u"\u2014$"
assert(pattern[:-1] == u"\u2014") # Ends with actual unicode char U+2014
assert(re.search(pattern, test) != None)
Mais Et si vous deviez construire votre modèle dynamiquement?
Vous créez une chaîne ' '\ u% s' d'abord, puis en interpolant le codepoint, et cela est * not * interprété comme "\ u ...." en premier. C'est * comportement attendu *. Utilisez 'u '% s'% unichr (codepoint)' à la place. –