msmsms Posted January 30, 2013 at 04:21 PM Report #493602 Posted January 30, 2013 at 04:21 PM (edited) 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 January 30, 2013 at 04:23 PM by msmsms
thoga31 Posted January 30, 2013 at 09:01 PM Report #493656 Posted January 30, 2013 at 09:01 PM 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!
Gnrtuga Posted January 30, 2013 at 09:10 PM Report #493658 Posted January 30, 2013 at 09:10 PM (edited) 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 January 30, 2013 at 09:12 PM 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.. :)
ffunenga Posted January 31, 2013 at 09:02 AM Report #493686 Posted January 31, 2013 at 09:02 AM 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
Gnrtuga Posted January 31, 2013 at 07:10 PM Report #493761 Posted January 31, 2013 at 07:10 PM 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.. :)
thoga31 Posted January 31, 2013 at 08:41 PM Report #493772 Posted January 31, 2013 at 08:41 PM 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!
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now