Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

msmsms

transformar cadeia

Recommended Posts

msmsms

boas

tenho a seguinte cadeia

c = 'ab[4c]'

e quero transforma-la de maneira a ficar com abcccc

ou seja, multiplicar de alguma forma o 4 em c

como faço?

Edited by msmsms

Share this post


Link to post
Share on other sites
thoga31

Com um mini-parser. Tens de analisar o conteúdo da string segundo um padrão e substituir as partes que são "código" no seu produto respectivo.


Knowledge is free!

Share this post


Link to post
Share on other sites
Gnrtuga

Boas, quando olhei a primeira vez parecia-me que tinhas uma lista um bocado estranha, mas depois vi que afinal tens uma string..

Não deve ser bem isto que queres, mas aqui fica:

cria 3 listas vazias

faz um for loop por cada carácter na string,

dentro desse for loop faz um if (ex: if not in 'abcd..'), e faz um append à primeira lista,

depois utilizas o ultimo valor da lista para multiplicares e adicionares a segunda lista para ficares ficares com cccc,

finalmente concatenas as duas primeiras na terceira..

Confuso? (confeso que eu também me perdi um bocadinho, quando comecei a escrever só tinha uma lista :) ...)

Boa Sorte!

edit: quando comecei a escrever o thoga31 ainda não tinha dito nada, e o meu raciocínio parecia-ME ter lógica... lol

Edited by Gnrtuga

Férias! Estou por aqui: http://maps.google.p...001549&t=h&z=20 (a bulir claro está!)

Nunca mais é verão outra vez.. :)

Share this post


Link to post
Share on other sites
ffunenga
Citação
faz um for loop por cada carácter na string,

Gnrtuga espero que n leves a mal mas: nem pensar! :) aliás, é importante colocar essa hipotese na mesa mas, posteriormente, decidir que não é uma boa ideia por se complicar muito facilmente. (Embora, seja a solução mais obvia para uma primeira analise)

Na minha opinião, o melhor para resolver este tipo de problemas é o modulo re [1] (no entanto, tenho pouca experiência com este modulo).

Em primeiro lugar, no interior dos parenteses rectos está uma linguagem propria. Mesmo que seja só:

"[" (inteiro a definir o numero de repetições) (string para repetir) "]"
eu não reconheço este tipo de gerador de strings.

Com isto em mente, eu diria para procurares com este padrão:


>>> exemplo1 = "ab[4c]de[5f]gh"
>>> exemplo2 = "As pe[2s]oas co[2r]em para o Ar[2e]iro"
>>> import re
>>> p = re.compile(r"\[\w*\]")
>>> for m in p.finditer(exemplo1): print m.group()[1:-1], m.span()
...
4c (2, 6)
5f (8, 12)
>>> for m in p.finditer(exemplo2): print m.group()[1:-1], m.span()
...
2s (5, 9)
2r (15, 19)
2e (31, 35)
Agora tens que hackar (não sei qual é a palavra portuguesa para este verbo... artimanhar?) os ciclos for de forma a extraires o número. Algo do género:

>>> exemplo3 = "O número de série é o [5F12g7]6B"
>>> p2 = re.compile(r"[-+]?\d+")
>>> for m in p1.finditer(exemplo3):
...	 generator = m.group()[1:-1]
...	 g = p2.match(generator)
...	 print m.group(), "->", int(g.group()), "vezes", generator[g.end():], "=", int(g.group())*generator[g.end():]
...
[5F12g7] -> 5 vezes F12g7 = F12g7F12g7F12g7F12g7F12g7
e substituires a string gerada na string original.

Tenho a sensação que existe um metodo dos objectos p1 e p2 para fazer a substituição directamente, mas n sei como se usa...

[1] http://docs.python.org/2/howto/regex.html#regex-howto

Share this post


Link to post
Share on other sites
Gnrtuga

ffunenga , claro que não levo a mal (se receberes alguma multa para pagar não fui eu.. :) ) , como disse a MIM parecia-me ter lógica..lol

Nunca tinha ouvido falar deste modulo... e muito sinceramente nem estou a perceber a utilidade.. mas acredito que deve ter.. :)


Férias! Estou por aqui: http://maps.google.p...001549&t=h&z=20 (a bulir claro está!)

Nunca mais é verão outra vez.. :)

Share this post


Link to post
Share on other sites
thoga31

O módulo re é poderosíssimo. Mas acho que o @msmsms ainda não está exactamente numa fase de o poder utilizar.

Além disso, acho que este exercício é excelente para treinar, de uma forma geral, a criação de mini-parsers e que pode ser facilmente transcrito noutras linguagens.

Resolvi o problema proposto não com um for mas sim com um while. Claro que não é universal e considera que qualquer string que tenha [] é uma string com "código". Seria necessário fazer um pequeno controlo para saber quando é que os [] eram código ou não.

Como digo, é um exercício muitíssimo interessante para nos obrigar a raciocinar.


Knowledge is free!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.