sub - regex python online




Expressions régulières Python pour implémenter la suppression de chaîne (4)

J'essaye d'implémenter l'effacement de chaîne avec Python regex et les références arrières, et il ne semble pas vouloir fonctionner très bien. Je suis sûr que c'est quelque chose que je fais mal mais je ne peux pas comprendre ce que ...

>>> import re
>>> mystring = r"This is \n a test \r"
>>> p = re.compile( "\\\\(\\S)" )
>>> p.sub( "\\1", mystring )
'This is n a test r'
>>> p.sub( "\\\\\\1", mystring )
'This is \\n a test \\r'
>>> p.sub( "\\\\1", mystring )
'This is \\1 a test \\1'

Je voudrais remplacer \\ [char] par \ [char], mais les références arrières dans Python ne semblent pas suivre les mêmes règles que dans toutes les autres implémentations que j'ai jamais utilisées. Quelqu'un pourrait-il jeter quelque lumière?


Eh bien, je pense que vous avez peut-être manqué le r ou mal compté les barres obliques inverses ...

"\\n" == r"\n"

>>> import re
>>> mystring = r"This is \\n a test \\r"
>>> p = re.compile( r"[\\][\\](.)" )
>>> print p.sub( r"\\\1", mystring )
This is \n a test \r
>>>

Ce qui, si j'ai compris, c'est ce qui a été demandé.

Je soupçonne que la demande la plus commune est la suivante:

>>> d = {'n':'\n', 'r':'\r', 'f':'\f'}
>>> p = re.compile(r"[\\]([nrfv])")
>>> print p.sub(lambda mo: d[mo.group(1)], mystring)
This is \
 a test \
>>>

L'étudiant intéressé devrait également lire Reflections on Trusting Trust de Ken Thompson, dans lequel notre héros utilise un exemple similaire pour expliquer les dangers des compilateurs de confiance que vous n'avez pas eux-mêmes amorcés à partir du code machine.


L'idée est que je vais lire dans une chaîne échappée, et l'annuler (une fonctionnalité qui manque notamment à Python, dont vous ne devriez pas avoir besoin de recourir à des expressions régulières en premier lieu). Malheureusement, je ne suis pas trompé par les barres obliques inverses ...

Un autre exemple illustratif:

>>> mystring = r"This is \n ridiculous"
>>> print mystring
This is \n ridiculous
>>> p = re.compile( r"\\(\S)" )
>>> print p.sub( 'bloody', mystring )
This is bloody ridiculous
>>> print p.sub( r'\1', mystring )
This is n ridiculous
>>> print p.sub( r'\\1', mystring )
This is \1 ridiculous
>>> print p.sub( r'\\\1', mystring )
This is \n ridiculous

Ce que je voudrais imprimer c'est

This is 
ridiculous

N'est-ce pas ce que fait le second exemple d'Anders?

En 2.5, il y a aussi un encodage d' string-escape vous pouvez appliquer:

>>> mystring = r"This is \n a test \r"
>>> mystring.decode('string-escape')
'This is \n a test \r'
>>> print mystring.decode('string-escape')
This is 
 a test 
>>> 

Vous êtes trompé par la représentation de Python de la chaîne de résultat. L'expression Python:

'This is \\n a test \\r'

représente la chaîne

This is \n a test \r

ce qui est je pense ce que tu voulais. Essayez d'ajouter 'print' devant chacun de vos appels p.sub () pour imprimer la chaîne actuelle retournée au lieu d'une représentation Python de la chaîne.

>>> mystring = r"This is \n a test \r"
>>> mystring
'This is \\n a test \\r'
>>> print mystring
This is \n a test \r




backreference