[python-brasil] Substituição de caracteres em string

967 views
Skip to first unread message

Isamp

unread,
Jul 11, 2007, 10:51:26 AM7/11/07
to python...@yahoogrupos.com.br

Oi Pessoal,

Desculpe se minha pergunta é banal ...

Tenho um string que pode conter determinados caracteres "indesejaveis",
eu gostaria e substitui-los.

Por exemplo:

stg = "<abra@cadabra$com$br>"

Eu poderia executar vários "replace":

stg = stg.replace('<','')
stg = stg.replace('@','_')
:
:

Mas certamente deve existir alguma alternativa mais inteligente ...
alguma dica ?
Estou examinando o modulo "re" ...

__._,_.___
,-----------------------------------------------------------.
| Antes de enviar um e-mail para o grupo leia:              |
| http://www.pythonbrasil.com.br/moin.cgi/AntesDePerguntar  |
| E se você é usuário do BOL lembre-se de cadastrar o       |
| e-mail do grupo na lista branca do seu sistema anti-spam. |
`-----------------------------------------------------------´
Atividade nos últimos dias
Visite seu Grupo
Yahoo! Mail

Conecte-se ao mundo

Proteção anti-spam

Muito mais espaço

Yahoo! Barra

Instale grátis

Buscar sites na web

Checar seus e-mails .

Yahoo! Grupos

Crie seu próprio grupo

A melhor forma de comunicação

.

__,_._,___

Adam Victor Nazareth Brandizzi

unread,
Jul 11, 2007, 11:26:11 AM7/11/07
to python...@yahoogrupos.com.br

On 7/11/07, Isamp <isamp@terra.com.br> wrote:
> Oi Pessoal,
>
> Desculpe se minha pergunta é banal ...
>
> Tenho um string que pode conter determinados caracteres "indesejaveis",
> eu gostaria e substitui-los.
>
> Por exemplo:
>
> stg = "<abra@cadabra$com$br>"
>
> Eu poderia executar vários "replace":
>
> stg = stg.replace('<','')
> stg = stg.replace('@','_')
> :
> :
>
> Mas certamente deve existir alguma alternativa mais inteligente ...
> alguma dica ?
> Estou examinando o modulo "re" ...

Tem uma forma mais simples, que é usar o método "translate" da classe
str. Infelizmente ele só é intuitivo para holandeses, mas vale a pena
dar uma olhada. Manda brasa! :)

--
Adam Victor Nazareth Brandizzi
http://brandizzi.googlepages.com/
http://www.google.com/reader/shared/05979608432730590670

__._,_.___

__,_._,___

Diego Manenti Martins

unread,
Jul 11, 2007, 12:04:04 PM7/11/07
to python...@yahoogrupos.com.br

> Tem uma forma mais simples, que é usar o método "translate" da classe
> str. Infelizmente ele só é intuitivo para holandeses, mas vale a pena
> dar uma olhada. Manda brasa! :)
>

hum..
pelo que consegui entender do translate:

>>> tabela = ['%c' % c for c in range(256)]
>>> tabela[ord('@')] = '_'
>>> tabela[ord('$')] = '#'
>>> '<abra@cadabra$com$br>'.translate(''.join(tabela))
'<abra_cadabra#com#br>'
>>>

o problema é gerar a tabela :)

--
Diego Manenti Martins
Técnico em eletrônica
+55 48 8421-1025


__,_._,___

Paulo Neves

unread,
Jul 11, 2007, 12:43:23 PM7/11/07
to python...@yahoogrupos.com.br

On 7/11/07, Isamp <isamp@terra.com.br> wrote:
>

> Tenho um string que pode conter determinados caracteres "indesejaveis",
> eu gostaria e substitui-los.
>
> Por exemplo:
>
> stg = "<abra@cadabra$com$br>"
>
> Eu poderia executar vários "replace":
>
> stg = stg.replace('<','')
> stg = stg.replace('@','_')
>

Eu usaria uma expressão regular. A maneira mais simples seria chamar duas
vezes a função sub:

In [5]:removidos = re.sub("[<>]", "", "<abra@cadabra$com$br>")

In [6]:removidos
Out[6]:'abra@cadabra$com$br'

In [7]:substituidos = re.sub("[@$]", "_", removidos)

In [8]:substituidos
Out[8]:'abra_cadabra_com_br'

Isto funciona bem se você só for substituir alguns caracteres por outro e
remover alguns. Se suas regras de substituição forem mais complexas e você
quiser enrolar seu código, aí pode em vez de passar uma string para ser
substituída, chamar uma função que recebe um "match object":

In [9]:def subFunc(matchObject):
.10.: matched = matchObject.group(0)
.10.: if matched == '@':
.10.: return '_'
.10.: elif matched == "$":
.10.: return '##'
.10.: return ''
.10.:

In [11]:re.sub("[<>@$]", subFunc, "<abra@cadabra$com$br>")
Out[11]:'abra_cadabra##com##br'

Expressões regulares parecem um pouco confusas, mas são uma ferramenta
fundamental para qualquer desenvolvedor. Se você não sabe muito a respeito,
recomendo fortemente o livro Mastering Regular Expressions do Jeffrey Friedl.
(http://regex.info/ ). O problema do livro é só que depois você vai querer
usar expressões regulares para tudo:-)

abs,
--
Paulo Eduardo Neves
http://NaoTemMosquito.blogspot.com

[As partes desta mensagem que não continham texto foram removidas]

__._,_.___

__,_._,___

Eduardo Dutka

unread,
Jul 11, 2007, 1:06:55 PM7/11/07
to python...@yahoogrupos.com.br

Poderia usar um dicionário para realizar as substituições, não sei se seria
a forma mais performática, mas funcionou.
Com certeza o pessoal aqui da lista deve lhe propor uma forma que seja
rápida :o)
Segue uma possibilidade:
[code]
>>> aux = ""
>>> dic = {"<":"", "@":"_", "$":"."}
>>> stg = "<abra@cadabra$com$br>"
>>> for i in range(len(stg)):
if stg[i] in dic:
aux = aux + string.replace(stg[i],stg[i],dic.get(stg[i]))
else:
aux = aux + stg[i]

>>> aux
'abra_cadabra.com.br>'
>>>
[/code]

Abraços

On 7/11/07, Paulo Neves <pauloneves@gmail.com> wrote:


__,_._,___

Paul Eipper

unread,
Jul 11, 2007, 1:15:47 PM7/11/07
to python...@yahoogrupos.com.br

Em 11/07/07, Eduardo Dutka<dutka.jlle@gmail.com> escreveu:


> Poderia usar um dicionário para realizar as substituições, não sei se seria
> a forma mais performática, mas funcionou.

eu tinha mesmo pensado nessa opção também :)



> Com certeza o pessoal aqui da lista deve lhe propor uma forma que seja
> rápida :o)
> Segue uma possibilidade:
> [code]
> >>> aux = ""
> >>> dic = {"<":"", "@":"_", "$":"."}
> >>> stg = "<abra@cadabra$com$br>"
> >>> for i in range(len(stg)):
> if stg[i] in dic:
> aux = aux + string.replace(stg[i],stg[i],dic.get(stg[i]))
> else:
> aux = aux + stg[i]
>
>
> >>> aux
> 'abra_cadabra.com.br>'
> >>>
> [/code]

eu substituiria o loop por um mais simples:

>>> for i, j in dic.items():
>>> stg = stg.replace(i, j)

--
Paul Eipper


__,_._,___

Marco André Lopes Mendes

unread,
Jul 11, 2007, 2:48:59 PM7/11/07
to python...@yahoogrupos.com.br

Veja se estas dicas te ajudam:

http://www.pythonbrasil.com.br/moin.cgi/TiradorDeAcentos

Um abraço

Marco André

> ,----------------------------------------------------------.


> | Antes de enviar um e-mail para o grupo leia: |
> | http://www.pythonbrasil.com.br/moin.cgi/AntesDePerguntar |
> | E se você é usuário do BOL lembre-se de cadastrar o |
> | e-mail do grupo na lista branca do seu sistema anti-spam. |

> `----------------------------------------------------------´
> Links do Yahoo! Grupos
>
>
>

--
Marco André
marcoandre@gmail.com

__._,_.___
,-----------------------------------------------------------.
| Antes de enviar um e-mail para o grupo leia:              |
| http://www.pythonbrasil.com.br/moin.cgi/AntesDePerguntar  |
| E se você é usuário do BOL lembre-se de cadastrar o       |
| e-mail do grupo na lista branca do seu sistema anti-spam. |
`-----------------------------------------------------------´
Atividade nos últimos dias
Visite seu Grupo
Yahoo! Mail

Conecte-se ao mundo

Proteção anti-spam

Muito mais espaço

Yahoo! Barra

Instale grátis

Buscar sites na web

Checar seus e-mails .

Yahoo! Grupos

Crie seu próprio grupo

A melhor forma de comunicação

.

__,_._,___

Adam Victor Nazareth Brandizzi

unread,
Jul 11, 2007, 4:44:03 PM7/11/07
to python...@yahoogrupos.com.br

On 7/11/07, Diego Manenti Martins <dmmartins@gmail.com> wrote:
> hum..
> pelo que consegui entender do translate:
>
> >>> tabela = ['%c' % c for c in range(256)]
> >>> tabela[ord('@')] = '_'
> >>> tabela[ord('$')] = '#'
> >>> '<abra@cadabra$com$br>'.translate(''.join(tabela))
> '<abra_cadabra#com#br>'
> >>>
>
> o problema é gerar a tabela :)

Não precisa de tanto... Você pode usar a função "maketrans" do módulo
string, que, creio, é mais eficiente - e a maneira canônica de
trabalhar:

>>> import string
>>> table = string.maketrans('@$', '_#')
>>> '<abra@cadabra$com$br>'.translate(t)
'<abra_cadabra#com#br>'

Até!

__._,_.___
,-----------------------------------------------------------.
| Antes de enviar um e-mail para o grupo leia:              |
| http://www.pythonbrasil.com.br/moin.cgi/AntesDePerguntar  |
| E se você é usuário do BOL lembre-se de cadastrar o       |
| e-mail do grupo na lista branca do seu sistema anti-spam. |
`-----------------------------------------------------------´
Atividade nos últimos dias
Visite seu Grupo
Yahoo! Mail

Conecte-se ao mundo

Proteção anti-spam

Muito mais espaço

Yahoo! Barra

Instale grátis

Buscar sites na web

Checar seus e-mails .

Yahoo! Grupos

Crie seu próprio grupo

A melhor forma de comunicação

.

__,_._,___

Leonardo Santagada

unread,
Jul 12, 2007, 12:10:30 AM7/12/07
to python...@yahoogrupos.com.br


Em 11/07/2007, às 17:44, Adam Victor Nazareth Brandizzi escreveu:

> On 7/11/07, Diego Manenti Martins <dmmartins@gmail.com> wrote:
>> hum..
>> pelo que consegui entender do translate:

[corta]


>> o problema é gerar a tabela :)
>
> Não precisa de tanto... Você pode usar a função "maketrans" do módulo
> string, que, creio, é mais eficiente - e a maneira canônica de
> trabalhar:

[corta]

o negócio é que o translate só funciona com ascii então eu não
recomendaria... os outros metodos parecem mais interessantes e
genericos.

--
Leonardo Santagada

__._,_.___
,-----------------------------------------------------------.
| Antes de enviar um e-mail para o grupo leia:              |
| http://www.pythonbrasil.com.br/moin.cgi/AntesDePerguntar  |
| E se você é usuário do BOL lembre-se de cadastrar o       |
| e-mail do grupo na lista branca do seu sistema anti-spam. |
`-----------------------------------------------------------´
Atividade nos últimos dias
Visite seu Grupo
Yahoo! Mail

Conecte-se ao mundo

Proteção anti-spam

Muito mais espaço

Yahoo! Barra

Instale grátis

Buscar sites na web

Checar seus e-mails .

Yahoo! Grupos

Crie seu próprio grupo

A melhor forma de comunicação

.

__,_._,___

Nilton Volpato

unread,
Jul 12, 2007, 1:40:15 AM7/12/07
to python...@yahoogrupos.com.br

On 7/12/07, Leonardo Santagada <santagada@gmail.com> wrote:
[...]


> o negócio é que o translate só funciona com ascii então eu não
> recomendaria... os outros metodos parecem mais interessantes e
> genericos.

O translate funciona qualquer caractere (byte) de uma cadeia do tipo
str. E como o Adam sugeriu, é mais fácil usar string.maketrans para
criar a tabela.

Agora no caso mais geral, quer dizer, se a cadeia for do tipo unicode,
também há um método translate que funciona de maneira quase intuitiva:

>>> s = u"<abra@cadabra$com$br>"
>>> s.translate({ ord(u'<'): None,
... ord(u'>'): None,
... ord(u'@'): u'_',
... ord(u'$'): u'.' })
u'abra_cadabra.com.br'

Basta passar um dict, ou algum objeto que se pareça com um dict,
contendo o mapeamento de um ordinal unicode (!) para uma cadeia
unicode ou None. Caso o mapeamento seja para None, então o caractere é
removido.

Abraços,
-- Nilton


__,_._,___

Isamp

unread,
Jul 12, 2007, 8:12:59 AM7/12/07
to python...@yahoogrupos.com.br

Beleza ... 'maketrans' funcionou quase bem !
Ainda tenho que usar replace para eliminar caracteres ...



Adam Victor Nazareth Brandizzi escreveu:

__._,_.___
,-----------------------------------------------------------.
| Antes de enviar um e-mail para o grupo leia:              |
| http://www.pythonbrasil.com.br/moin.cgi/AntesDePerguntar  |
| E se você é usuário do BOL lembre-se de cadastrar o       |
| e-mail do grupo na lista branca do seu sistema anti-spam. |
`-----------------------------------------------------------´
Atividade nos últimos dias
Visite seu Grupo
Yahoo! Mail

Conecte-se ao mundo

Proteção anti-spam

Muito mais espaço

Yahoo! Barra

Instale grátis

Buscar sites na web

Checar seus e-mails .

Yahoo! Grupos

Crie seu próprio grupo

A melhor forma de comunicação

.

__,_._,___

Paulo Neves

unread,
Jul 12, 2007, 1:07:12 PM7/12/07
to python...@yahoogrupos.com.br

On 7/12/07, Nilton Volpato <nilton.volpato@gmail.com> wrote:
>
>
> Agora no caso mais geral, quer dizer, se a cadeia for do tipo unicode,
> também há um método translate que funciona de maneira quase intuitiva:
>
> >>> s = u"<abra@cadabra$com$br>"
> >>> s.translate({ ord(u'<'): None,
> ... ord(u'>'): None,
> ... ord(u'@'): u'_',
> ... ord(u'$'): u'.' })
> u'abra_cadabra.com.br'
>
> Basta passar um dict, ou algum objeto que se pareça com um dict,
> contendo o mapeamento de um ordinal unicode (!) para uma cadeia
> unicode ou None. Caso o mapeamento seja para None, então o caractere é
> removido.
>

Ei, boa esta, não conhecia. Não sabia que para unicode podia passar o
dicionário direto e nem que com o valor None removia. Fiz um teste e vi que
também pode-se colocar mais de um caracter no valor, trocando uma letra por
várias. Assim:

In [17]:s = u"<abra@cadabra$com$br>"

In [18]:s.translate({ ord(u'<'): None, ord(u'>'): None, ord(u'@'): u'$$$',


ord(u'$'): u'.' })

Out[18]:u'abra$$$cadabra.com.br'

Vou fazer mais uso disto. Em matería de clareza de código acho que foi a
melhor das soluções apresentadas aqui.

Este negócio de só funcionar para unicode é que é pouco pythônico.


--
Paulo Eduardo Neves
http://NaoTemMosquito.blogspot.com

[As partes desta mensagem que não continham texto foram removidas]


__,_._,___
Reply all
Reply to author
Forward
0 new messages