1
votes

l'expression rationnelle ne peut pas correspondre aux symboles spéciaux en python

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


4 commentaires

Regardez votre chaîne , elle n'a pas de littéral \ xaf , 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/...


3 Réponses :


2
votes

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))


0 commentaires

0
votes

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.


0 commentaires

2
votes

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))


1 commentaires

Désolé, erreur stupide de copier / coller, code mis à jour, essayez maintenant.