Python expressões regulares para implementar unescaping corda

votos
11

Eu estou tentando implementar unescaping string com Python regex e referências anteriores, e não parece querer trabalhar muito bem. Eu tenho certeza que é algo que eu estou fazendo errado, mas eu não consigo descobrir o que ...

>>> import re
>>> mystring = rThis 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'

Eu gostaria de substituir \\ [Char] com \ [Char], mas backreferences em Python não parecem seguir as mesmas regras que eles fazem em qualquer outra aplicação que já usei. Alguém poderia lançar alguma luz?

Publicado 17/08/2008 em 19:20
fonte usuário
Em outras línguas...                            


5 respostas

votos
8

Não é isso que segundo exemplo Anders' faz?

Em 2,5 há também uma string-escapecodificação você pode aplicar:

>>> 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 
>>> 
Respondeu 17/08/2008 em 22:36
fonte usuário

votos
3

Bem, eu acho que você pode ter perdido o r ou contado mal as barras invertidas ...

"\\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
>>>

Que, se eu entendi é o que foi solicitado.

Eu suspeito que o pedido mais comum é esta:

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

O estudante interessado deve também ler de Ken Thompson Reflexões sobre Confiando Trust" , onde o nosso herói usa um exemplo semelhante para explicar os perigos de confiar em compiladores você não bootstrap de código de máquina si mesmo.

Respondeu 17/08/2008 em 20:01
fonte usuário

votos
0

Marca; seu segundo exemplo exige cada personagem escapou jogado em uma matriz inicialmente, o que gera um KeyError se a sequência de escape acontece para não ser na matriz. Ele vai morrer em nada, mas os três personagens fornecidos (dar \ va tentativa), e enumerando cada seqüência de escape possível cada vez que você quiser unescape uma string (ou manter uma matriz global) é uma solução muito ruim. Análogo ao PHP, que está usando preg_replace_callback()com um lambda em vez de preg_replace(), que é totalmente desnecessário nesta situação.

Me desculpe se eu estou saindo como um pau sobre isso, eu sou apenas totalmente frustrado com Python. Isto é suportado por todos os outros mecanismo de expressões regulares que já usei, e eu não consigo entender por que isso não iria funcionar.

Obrigado por responder; a string.decode('string-escape')função é precisamente o que eu estava procurando inicialmente. Se alguém tem uma solução geral para o problema backreference regex, fique à vontade para postá-lo e eu vou aceitar isso como uma resposta também.

Respondeu 17/08/2008 em 22:55
fonte usuário

votos
0

A ideia é que eu vou ler em uma corda escapou e unescape-lo (uma característica nomeadamente falta de Python, que você não deve precisar de recorrer a expressões regulares para, em primeiro lugar). Infelizmente eu não estou sendo enganado por as barras invertidas ...

Outro exemplo ilustrativo:

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

O que eu gostaria que ele para imprimir é

This is 
ridiculous
Respondeu 17/08/2008 em 20:40
fonte usuário

votos
0

Você está sendo enganado por representação do Python da corda resultado. A expressão Python:

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

representa a string

This is \n a test \r

que é que eu acho que você queria. Tente adicionar 'print' na frente de cada um de seus p.sub () chama para imprimir a seqüência real retornado ao invés de uma representação Python da cadeia.

>>> mystring = r"This is \n a test \r"
>>> mystring
'This is \\n a test \\r'
>>> print mystring
This is \n a test \r
Respondeu 17/08/2008 em 20:26
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more