Форум сайта python.su
857
>>> import re
>>> sa = 'abc32def2A3'
>>> sb = ''.join(c * int(n) for c, n in re.findall('([^\d]+)(\d+)', sa))
>>> sb
'abcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcdefdefAAA'
>>> sc = ''.join(m[0]*int(m[1:]) for m in re.findall('.\d+', sa))
>>> sc
'ccccccccccccccccccccccccccccccccffAAA'
>>> sc = eval(re.sub('(.)(\d+)', r'"\1"*\2+', sa)[:-1])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1
ab"c"*32+de"f"*2+"A"*3
^
SyntaxError: invalid syntax
>>>
>>> import this
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
>>>
Отредактировано (Окт. 7, 2010 03:55:06)
Офлайн
7
py.user.nextЧтобы о нем не думать.
а для чего там r ?
Офлайн
7
Забыли еще один вариант:
>>> import re
>>> sa = 'abc32def2A3'
>>> re.sub('.\d+', lambda x: x.group()[0]*int(x.group()[1:]), sa)
'abccccccccccccccccccccccccccccccccdeffAAA'
Отредактировано (Окт. 7, 2010 10:20:01)
Офлайн
0
Ребята, это хорошо что вы пишите разные короткие версии, но мне бы для начала свою сделать чтобы работала, а потом уже упрощать ее.
Офлайн
13
breidosЭто не ответ пока, к сожалению. Перечитайте мой пост и попробуйте сделать так, как я советовал. Если что непонятно - спрашивайте.
Вот добавил в одном месте = и ответ вывел
Отредактировано (Окт. 7, 2010 12:44:28)
Офлайн
0
Вот если так сделать:
x="Z15x33A2"
i=0
k=''
l=''
res=''
while i<len(x):
try:
if int(x[i]):
k+=x[i]
res=l*int(k)
except:
print res,
k=''
l=x[i]
i+=1
>>>
ZZZZZZZZZZZZZZZ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
>>>
>>>
ZZZZZZZZZZZZZZZ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx AA
Офлайн
13
С этим мы еще разберемся. Ответ у вас с пробелом, чего не должно быть, то есть программа еще не делает то, что нужно.
Позволю себе еще раз обратить внимание на мой пост, а именно на фразы “проверить есть ли у вас предыдущая буква(ее нужно запомнить в переменной, а не выводить) и число”, “добавить буква*число к результату” и “Результат вывести после цикла”.
Если вы внимательно посмотрите на ваш код, то ни проверки ни добавления к результату ни вывода после цикла там не обнаружите. Попробуйте все-таки сделать это все и покажите чего получилось. Да, вывод будет неполным, но мы это попробуем победить.
И еще: использование try/except без указания исключения, которое ловим - очень серьезная ошибка, так нельзя делать ни в коем случае. Попробуйте использовать isdigit, как тут советовали, либо указывайте исключение явно.
Офлайн
0
Вот что у меня получилось: Ответ выводит без пробела, но неполный, ошибок не показывает. А
Edя так и непонял как написать.
“проверить есть ли у вас предыдущая буква(ее нужно запомнить в переменной, а не выводить) и число”
x="Z15x33A2"
i=0
k=''
l=''
res=''
otvet=""
while i<len(x):
try:
if int(x[i]):
k+=x[i]
res=l*int(k)
except:
k=''
l=x[i]
otvet+=res
i+=1
print otvet
Отредактировано (Окт. 7, 2010 16:00:51)
Офлайн
13
Хорошо. Только otvet не нужен, постарайтесь обойтись res. И res=l*int(k) не нужно делать на каждую цифру, это совершенно лишнее. Достаточно сделать там, где появилась следующая буква. В этом случае у нас в k уже будет весь множитель.
И с try/except разберитесь.
Проверить есть ли у нас уже буква и число просто - нужно проверить не пусты ли у нас k и l. Если мы в них что-то прочитали уже, то они не будут пустыми. Эта проверка позволит отловить случаи, когда формат строки неверен, например строка начинается с числа.
Офлайн
0
x="Z15x33A2"
i=0
k=''
l=''
res=''
while i<=len(x):
try:
if int(x[i]):
k+=x[i]
res=l*int(k)
except:
print res,
k=''
l=x[i]
i+=1
Офлайн