Pergunta

Estou tentando implementar o escape de string com regex e referências anteriores do Python, e parece que não quer funcionar muito bem.Tenho certeza de que é algo que estou fazendo errado, mas não consigo descobrir o 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'

Eu gostaria de substituir \\[char] por \[char], mas as referências anteriores em Python não parecem seguir as mesmas regras que seguem em todas as outras implementações que já usei.Alguém poderia lançar alguma luz?

Foi útil?

Solução

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

Em 2.5 há também um string-escape codificação que 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 
>>> 

Outras dicas

Bem, acho que você pode ter perdido o r ou contado incorretamente 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
>>>

O que, se bem entendi, é o que foi solicitado.

Suspeito que a solicitação mais comum seja 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 aluno interessado também deve ler o livro de Ken Thompson Reflexões sobre Confiar na Confiança", em que nosso herói usa um exemplo semelhante para explicar os perigos de confiar em compiladores que você mesmo não inicializou a partir do código de máquina.

A idéia é que eu leia uma string com escape e retire-a do escape (um recurso que falta notavelmente no Python, para o qual você não deveria precisar recorrer a expressões regulares em primeiro lugar).Infelizmente não estou sendo enganado pelas 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 fosse impresso é

This is 
ridiculous

Você está sendo enganado pela representação da string de resultado do Python.A expressão Python:

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

representa a corda

This is \n a test \r

que é o que eu acho que você queria.Tente adicionar 'print' na frente de cada uma de suas chamadas p.sub() para imprimir a string real retornada em vez de uma representação Python da string.

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

Marca;seu segundo exemplo requer que cada caractere de escape seja lançado inicialmente em um array, o que gera um KeyError se a sequência de escape não estiver no array.Ele morrerá em qualquer coisa, exceto nos três caracteres fornecidos (tente \v), e enumerar todas as sequências de escape possíveis toda vez que você quiser remover o escape de uma string (ou manter uma matriz global) é uma solução muito ruim.Análogo ao PHP, isso está usando preg_replace_callback() com um lambda em vez de preg_replace(), o que é totalmente desnecessário nesta situação.

Me desculpe se estou parecendo um idiota por causa disso, estou totalmente frustrado com Python.Isso é suportado por todos os outros mecanismos de expressão regular que já usei e não consigo entender por que isso não funcionaria.

Obrigado por responder;o string.decode('string-escape') function é exatamente o que eu estava procurando inicialmente.Se alguém tiver uma solução geral para o problema de referência anterior de regex, sinta-se à vontade para publicá-la e aceitarei isso como resposta também.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top