Уведомления

Группа в Telegram: @pythonsu

#1 Март 12, 2013 17:50:09

nightvi
Зарегистрирован: 2013-03-12
Сообщения: 21
Репутация: +  0  -
Профиль   Отправить e-mail  

Задачка на регулярные выражения

Программа должна открыть файл с русским текстом и выполнить в нем следующую замену: сократить все последовательности согласных букв до одной, убрав в такой последовательности все согласные кроме первой (программа -> погама) и полученный результат записать в новый файл.
начало и конец я понимаю как делать а вот саму середину нет.
Помогите , плиз

# coding: utf-8
import re
data = open('book.txt').read().decode('utf-8')
Что тут писать не знаю
open('new_book.txt','w').write(data.encode('utf-8'))

Офлайн

#2 Март 12, 2013 19:30:26

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

Задачка на регулярные выражения

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import re
 
text = u"""Программа должна открыть файл с русским текстом и выполнить...
ЦККПССРСФСР"""
 
def repl(m):
    return m.group(1)[0]
     
fixed = re.sub(ur"(?<=\B)([цкнгшщзхфвпрлджчсмтб]{2,})", repl, text,
               flags=re.I + re.U)
print fixed

Офлайн

#3 Март 13, 2013 02:15:19

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9747
Репутация: +  843  -
Профиль   Отправить e-mail  

Задачка на регулярные выражения

>>> import re
>>> 
>>> s = """
... abcdefgabcdefg
... абвгдеёабвгдеё
... """
>>> 
>>> pat = r'([{0}])[{0}]+'.format(
...     'bcdfghjklmnpqrstvwxz'
...     'бвгджзйклмнпрстфхцчшщъь'
... )
>>> 
>>> output = re.sub(pat, r'\1', s, flags=re.I)
>>> print(output)
abefabef
абеёабеё
>>>



Офлайн

#4 Март 13, 2013 04:00:47

nightvi
Зарегистрирован: 2013-03-12
Сообщения: 21
Репутация: +  0  -
Профиль   Отправить e-mail  

Задачка на регулярные выражения

Попробовал этот вариант ничего не получилось текст просто переписался в новый файл

# coding: utf-8
import re
s = open('book.txt').read().decode('utf-8')
pat = r'()+'.format('bcdfghjklmnpqrstvwxz', ‘бвгджзйклмнпрстфхцчшщъь’)
output = re.sub(pat, r'\1', s, flags=re.I)
open('newbook.txt','w').write(output.encode('utf-8'))

А вот этот вариант получился, спасибо большое

# coding: utf-8
import re
text = open('book.txt').read().decode('utf-8')
def repl(m):
return m.group(1)

fixed = re.sub(ur"(?<=\B)({2,})", repl, text,
flags=re.I + re.U)
open('new2book.txt','w').write(fixed.encode('utf-8'))

А можно узнать где в первом ошибка? мне его както проще преподу будет объяснить

Офлайн

#5 Март 13, 2013 04:24:19

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9747
Репутация: +  843  -
Профиль   Отправить e-mail  

Задачка на регулярные выражения

nightvi
pat = r'()+'.format('bcdfghjklmnpqrstvwxz', ‘бвгджзйклмнпрстфхцчшщъь’)
я такое не писал



Офлайн

#6 Март 13, 2013 06:58:16

nightvi
Зарегистрирован: 2013-03-12
Сообщения: 21
Репутация: +  0  -
Профиль   Отправить e-mail  

Задачка на регулярные выражения

py.user.next
я такое не писал
я подумал что так можно преобразовать вот этот фрагмент
>>> pat = r'([{0}])[{0}]+'.format(
...     'bcdfghjklmnpqrstvwxz'
...     'бвгджзйклмнпрстфхцчшщъь'
... )

Нет?
Мне просто надо все в одном файле представить. А как правильно его записать надо?

Отредактировано nightvi (Март 13, 2013 06:58:49)

Офлайн

#7 Март 13, 2013 09:18:52

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9747
Репутация: +  843  -
Профиль   Отправить e-mail  

Задачка на регулярные выражения

в одну строку он выглядит так:

pat = r'([{0}])[{0}]+'.format('bcdfghjklmnpqrstvwxzбвгджзйклмнпрстфхцчшщъь')
но она слишком длинная, поэтому перенесено и использована конкатенация

nightvi
А как правильно его записать надо?
правильно так и пиши, просто надо убрать “>>> ” и “… ” в начале



Отредактировано py.user.next (Март 13, 2013 09:20:06)

Офлайн

#8 Март 13, 2013 17:30:09

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

Задачка на регулярные выражения

Хм, с (?<=\B) я перемудрил. Подумал, что первую последовательность нельзя трогать.

Офлайн

#9 Март 13, 2013 18:22:05

nightvi
Зарегистрирован: 2013-03-12
Сообщения: 21
Репутация: +  0  -
Профиль   Отправить e-mail  

Задачка на регулярные выражения

reclosedev
Хм, с (?<=\B) я перемудрил. Подумал, что первую последовательность нельзя трогать.
ага я ее просто убрал и все работает. Спасибо большое

а вот это не работает
# coding: utf-8
import re
s = open('book.txt').read().decode('utf-8')
pat = r'([{0}])[{0}]+'.format('bcdfghjklmnpqrstvwxzбвгджзйклмнпрстфхцчшщъь')
output = re.sub(pat, r'\1', s, flags=re.I)
open('newbook.txt','w').write(output.encode('utf-8'))

может подскажет где ошибка? версия питона 27

Отредактировано nightvi (Март 13, 2013 18:25:04)

Офлайн

#10 Март 13, 2013 19:15:22

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

Задачка на регулярные выражения

nightvi
может подскажет где ошибка? версия питона 27
Связано с особенностью работы со строками в 2.7.
Строки из файла декодируются в Юникод, поэтому дальше тоже нужно использовать Юникод.
Т.е. меняем паттерн:
pat = ur'([{0}])[{0}]+'.format(u'bcdfghjklmnpqrstvwxzбвгджзйклмнпрстфхцчшщъь')
И добавляем флаг re.U (re.UNICODE), чтобы правильно работал флаг re.I (игнорирование регистра):
output = re.sub(pat, r'\1', s, flags=re.I + re.U)

Про Юникод в 2.7:
http://docs.python.org/2/howto/unicode.html
http://nedbatchelder.com/text/unipain.html
http://habrahabr.ru/post/135913/

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version