J'ai une chaîne: s = "we are \ xaf \ x06OK \ x03family, good" , et je veux remplacer le \ xaf , \ x06 et \ x03 avec '', l'expression rationnelle est pat = re.compile (r '\\ [xX] [0-9a-fA-F] +') , mais il ne peut rien correspondre. Le code est ci-dessous:
pat = re.compile(r'\\[xX][0-9a-fA-F]+') s = "we are \xaf\x06OK\x03family, good" print(s) print(re.sub(pat, '', s))
Le résultat est
nous sommes ¯OKfamille, bien
nous sommes ¯OKfamille, bien ,
Mais comment puis-je obtenir nous sommes OK famille, bien
3 Réponses :
vous devez considérer votre entrée string s comme une chaîne brute alors ce travail, voir l'exemple ci-dessous:
pat = re.compile(r'\\[xX][0-9a-fA-F].') s = r"we are \xaf\x06OK\x03family, good" print(s) print(re.sub(pat, '', s))
Une autre approche:
pat = re.compile(r'[^\w\d\s,]+')
s = "we are \xaf\x06OK\x03family, good"
print(' '.join(map(lambda x: x.strip(), pat.split(s))))
#=> we are OK family, good
Utilisé la correspondance inverse, supprimez (divisez par) tous les caractères qui ne sont pas ce que vous vouliez.
Vous faites l'erreur basique mais courante de confondre la représentation d'une chaîne en code source Python avec sa valeur réelle.
Il existe un certain nombre de codes d'échappement en Python qui ne se représentent pas textuellement dans les chaînes régulières du code source code. Par exemple, "\ n" représente un seul caractère de nouvelle ligne, même si la notation Python occupe deux caractères. La barre oblique inverse est utilisée pour introduire cette notation. Il existe un certain nombre de codes d'échappement dédiés tels que \ r , \ a , etc., et une notation généralisée \ x01 qui vous permet d'écrire n'importe quel code de caractère en notation hexadécimale ( \ n est équivalent à \ x0a , \ r est équivalent à \ x0d , etc). Pour représenter une barre oblique inverse littérale, vous devez l'échapper avec une autre barre oblique inverse: "\\".
Dans une "chaîne brute", aucune barre oblique inverse n'est prise en charge; donc r "\ n" représente une chaîne contenant deux caractères, une barre oblique inverse littérale \ et une minuscule littérale n . Vous pouvez écrire de manière équivalente "\\ n" en utilisant une notation de chaîne non brute. Le préfixe r ne fait pas partie de la chaîne, il indique simplement à Python comment interpréter la chaîne entre les guillemets suivants (c'est-à-dire aucune interprétation; chaque caractère se représente textuellement).
Votre question ne précise pas laquelle de ces interprétations vous avez réellement besoin, je vais donc présenter des solutions pour les deux.
Voici une chaîne littérale contenant des barres obliques inverses réelles:
pat = re.compile(r'[\x00-\x1f\x80-\xff]+') s = "we are \xaf\x06OK\x03family, good" print(s) print(re.sub(pat, '', s))
Désolé, erreur stupide de copier / coller, code mis à jour, essayez maintenant.
Regardez votre chaîne , elle n'a pas de littéral
\ xaf code >, etc. Votre expression régulière n'y trouve aucune correspondance.Puis-je le faire correspondre?
Vous ne pouvez pas faire correspondre le texte manquant dans la chaîne.
Si vous souhaitez supprimer tous les caractères de contrôle, consultez stackoverflow.com/questions/4324790/...