Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 8, 2012 11:26:59

Duck-Pagan
Зарегистрирован: 2012-05-02
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Регулярные выражения.

Решил поиграться-разбираться с этими демоническими выражениями.

Балуюсь с фильтрами и изменениями строк.

Когда у нас строка вида: ‘lalala 4’
Представить ее в виде: ‘lalala 10’ - не проблема

re.sub('\d+', '10', 'lalala 4')

Но проблема с изменением строки возникает тут: ‘lalla 2 blala 14 lfddf’
- когда я хочу получить, например, такую строку: 'lalla subnum(0) blala subnum(1) lfddf'

Висну на моменте, как поставить измененные числа в соответствии с их местами:
import re
import random
zindex = 'lalla 2 blala 14 lfddf'
numb = re.compile('\d+')
subnum = [str(int(i)+random.randint(-5,5)) for i in numb.findall(zindex)]
При попытки использовать re.sub() - изменяются оба числа, как должен выглядить фильтр для pattern - не могу сообразить, если это вообще верный подход.

Отредактировано Duck-Pagan (Авг. 8, 2012 11:27:38)

Офлайн

#2 Авг. 8, 2012 12:12:44

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Регулярные выражения.

Duck-Pagan
Но проблема с изменением строки возникает тут: ‘lalla 2 blala 14 lfddf’
- когда я хочу получить, например, такую строку: ‘lalla subnum(0) blala subnum(1) lfddf’
Не совсем понятно, что такое subnum(0).

re.sub может функцию принимать вместо строки-замены, а там уж можно любых дел натворить:
import re
import itertools
 
zindex = 'lalla 2 blala 14 lfddf'
 
def position_tagger(start=0):
    counter = itertools.count(start)
    def wrapped(match):
        return str(counter.next())
    return wrapped
 
print re.sub('\d+', position_tagger(), zindex) # lalla 0 blala 1 lfddf

Отредактировано reclosedev (Авг. 8, 2012 12:13:46)

Офлайн

#3 Авг. 8, 2012 13:20:14

Duck-Pagan
Зарегистрирован: 2012-05-02
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

Регулярные выражения.

subnum - это list, содержащий цифры, полученные из строки. В коде ниже(выше). Просто квадратные скобки не отображаются - поэтому использовал круглые.
Модуль itertools - почитаю.

Отредактировано Duck-Pagan (Авг. 8, 2012 13:20:34)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version