Jump to content
msmsms

transformar uma string

Recommended Posts

msmsms

ola

eu tenho esta string

string = 'AB[12c]d[2E][4F]g'

e quero obter a string 'ABccccccccccccdEEFFFFg'

onde os numero que estão dentro de [ ] vão multiplicar esse numero de letras e depois os parateses somem

qual a forma mais simples de resolver?

Share this post


Link to post
Share on other sites
djthyrax

Provavelmente fazendo um match do que está dentro de [] com regex e depois substituis o que encontraste pelo que é suposto lá estar. Existe aí um tutorial no fórum do rolando2424 sobre regex.

https://www.portugal-a-programar.pt/topic/19938-python-tutorial-de-regex-by-pyteam/

Edited by djthyrax

Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!

Share this post


Link to post
Share on other sites
KTachyon

Seguindo a sugestão do djthyrax, eu sugeria que utilizasses o re.sub(). Com uma expressão regular procuras os grupos isolados por '[' e ']', e envias o resultado para uma função:

stringFinal = re.sub('\[[0-9]+.+?\]', trataGrupo, string)

Na função vais obter as substrings com os caracteres '[' e ']' que podes facilmente retirar. Depois podes utilizar o re.search() para obter o valor que está no início dessa substring:

repete = re.search('^[0-9]+', str).group(0)

Depois é só uma questão de construíres a substring e retornar.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
msmsms

Seguindo a sugestão do djthyrax, eu sugeria que utilizasses o re.sub(). Com uma expressão regular procuras os grupos isolados por '[' e ']', e envias o resultado para uma função:

stringFinal = re.sub('\[[0-9]+.+?\]', trataGrupo, string)

Na função vais obter as substrings com os caracteres '[' e ']' que podes facilmente retirar. Depois podes utilizar o re.search() para obter o valor que está no início dessa substring:

repete = re.search('^[0-9]+', str).group(0)

Depois é só uma questão de construíres a substring e retornar.

o exemplo que ele deixou é muito complexo para mim que ainda vou no a,e,i,o,u

Share this post


Link to post
Share on other sites
KTachyon

Mas a parte que ele deixou já eu te dei. São as expressões regulares:

\[[0-9]+.+?\]

e

^[0-9]+

No fundo significam:

\[       ## procura um '['
[0-9]+   ## uma ou mais ocorrências de dígitos
.+?      ## uma ou mais ocorrências de qualquer caracter até aparecer o próximo valor da regex
\]       ## procura um ']'

^        ## a partir do início da string procura:
[0-9]+   ## uma ou mais ocorrências de dígitos

Só tens que aplicar ao teu problema. Tens que fazer o import:

import re

Precisas de uma função que recebe um matchObj e que o converte na string:

def trataGrupo(match):
   str = match.group(0) ## obtém um resultado da expressão regular (ex: '[12c]')
   str = str[1:-1] ## remove o primeiro e o último caracteres '[' e ']' (fica '12c')
   n = re.search('^[0-9]+', str).group(0) ## obtém o número que está no início da string (n = '12')
   t = str[len(n):] ## obtém o restante texto da string (t = 'c')

   result = ''

   for x in range(0, int(n)):
       result += t

   return result ## (result = 'cccccccccccc')


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
thoga31

Se não quiseres utilizar regex, tens a outra solução: bater código.

Tens de percorrer caracter a caracter, e quando encontrares um [ tens de analisar o seu conteúdo até terminar com um ]. Se assumires que dentro dos [] está um número e um caracter, poupas no código evitando verificações.

Essencialmente vais ter um ciclo for com uns ifs e possivelmente outro for lá dentro.


Knowledge is free!

Share this post


Link to post
Share on other sites
hmiguel

Sem regex, poderia ser mais ou menos isto:


def fun1(string):
   bloco = False
   out = ""

   for iletra in range(len(string)): #percorre cada letra da string (index)
       if string[iletra] == "[": #inicio do bloco
           num = "" #novo numero
           bloco = True

       elif string[iletra] == "]": #fim do bloco
           bloco = False

       else:
           if bloco == True:
               if string[iletra+1] == "]":
                   num = int(num) #converte para inteiro
                   out += string[iletra]*num #adiciona letra x numero
               else:
                   num += string[iletra] #adiciona novo numero
           else:
               out += string[iletra] #adiciona letra

   return out

string = "AB[12c]d[2E][4F]g"
print fun1(string)

Edited by hmiguel

"Homem que é Homem não usa Java!"

Share this post


Link to post
Share on other sites
thoga31

Não era suposto dar a solução, mas dicas de como se chegar a ela. Mas ok...


Knowledge is free!

Share this post


Link to post
Share on other sites
djthyrax

No código do KTachyon, em vez de :

	for x in range(0, int(n)):
	result += t

Podias utilizar int(n)*t:

>>> n = 50
>>> c = 'a'
>>> n*c
'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'

EDIT: De notar que c pode ser qualquer string. Se fosse 'abc', o resultado seria 'abcabcabcabc........' 50 vezes.

Edited by Rui Carlos
  • Vote 1

Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!

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

×
×
  • Create New...

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.