Найти - Пользователи
Полная версия: Буквы и/или числа в строке
Начало » Python для новичков » Буквы и/или числа в строке
1 2 3 4 5 6
py.user.next
>>> 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!
>>>
Isem
py.user.next
а для чего там r ?
Чтобы о нем не думать.
Isem
Забыли еще один вариант:
>>> import re
>>> sa = 'abc32def2A3'
>>> re.sub('.\d+', lambda x: x.group()[0]*int(x.group()[1:]), sa)
'abccccccccccccccccccccccccccccccccdeffAAA'
Ну а по поводу догматизма и демагогии можно почитать тут:
http://ru.wikipedia.org/wiki/%D0%94%D0%BE%D0%B3%D0%BC%D0%B0
тут:
http://ru.wikipedia.org/wiki/%D0%94%D0%BE%D0%B3%D0%BC%D0%B0%D1%82%D0%B8%D0%B7%D0%BC
и тут:
http://ru.wikipedia.org/wiki/%D0%94%D0%B5%D0%BC%D0%B0%D0%B3%D0%BE%D0%B3%D0%B8%D1%8F
breidos
Ребята, это хорошо что вы пишите разные короткие версии, но мне бы для начала свою сделать чтобы работала, а потом уже упрощать ее.
Ed
breidos
Вот добавил в одном месте = и ответ вывел
Это не ответ пока, к сожалению. Перечитайте мой пост и попробуйте сделать так, как я советовал. Если что непонятно - спрашивайте.

PS: Вот этот пост: http://www.python.su/forum/viewtopic.php?pid=57102#p57102 Может вы просто пропустили его как-нибудь?
breidos
Вот если так сделать:
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
+ еще ошибку выдает - string index out of range
Ed
С этим мы еще разберемся. Ответ у вас с пробелом, чего не должно быть, то есть программа еще не делает то, что нужно.
Позволю себе еще раз обратить внимание на мой пост, а именно на фразы “проверить есть ли у вас предыдущая буква(ее нужно запомнить в переменной, а не выводить) и число”, “добавить буква*число к результату” и “Результат вывести после цикла”.
Если вы внимательно посмотрите на ваш код, то ни проверки ни добавления к результату ни вывода после цикла там не обнаружите. Попробуйте все-таки сделать это все и покажите чего получилось. Да, вывод будет неполным, но мы это попробуем победить.

И еще: использование try/except без указания исключения, которое ловим - очень серьезная ошибка, так нельзя делать ни в коем случае. Попробуйте использовать isdigit, как тут советовали, либо указывайте исключение явно.
breidos
Вот что у меня получилось: Ответ выводит без пробела, но неполный, ошибок не показывает. А
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
Ed
Хорошо. Только otvet не нужен, постарайтесь обойтись res. И res=l*int(k) не нужно делать на каждую цифру, это совершенно лишнее. Достаточно сделать там, где появилась следующая буква. В этом случае у нас в k уже будет весь множитель.

И с try/except разберитесь.

Проверить есть ли у нас уже буква и число просто - нужно проверить не пусты ли у нас k и l. Если мы в них что-то прочитали уже, то они не будут пустыми. Эта проверка позволит отловить случаи, когда формат строки неверен, например строка начинается с числа.
breidos
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
Блин, кто могет помогите, пишу так и неполучается доделать :(
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB