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" ...
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
> 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
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]
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:
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
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
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é!
--
Adam Victor Nazareth Brandizzi
http://brandizzi.googlepages.com/
http://www.google.com/reader/shared/05979608432730590670
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
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
Beleza ... 'maketrans' funcionou quase bem !
Ainda tenho que usar replace para eliminar caracteres ...
Adam Victor Nazareth Brandizzi escreveu:
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]