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

# coding: utf-8
import re
data = open('book.txt').read().decode('utf-8')
Что тут писать не знаю
open('new_book.txt','w').write(data.encode('utf-8'))
reclosedev
#!/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
py.user.next
>>> import re
>>> 
>>> s = """
... abcdefgabcdefg
... абвгдеёабвгдеё
... """
>>> 
>>> pat = r'([{0}])[{0}]+'.format(
...     'bcdfghjklmnpqrstvwxz'
...     'бвгджзйклмнпрстфхцчшщъь'
... )
>>> 
>>> output = re.sub(pat, r'\1', s, flags=re.I)
>>> print(output)
abefabef
абеёабеё
>>>
nightvi
Попробовал этот вариант ничего не получилось текст просто переписался в новый файл

# 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'))

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

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

nightvi
А как правильно его записать надо?
правильно так и пиши, просто надо убрать “>>> ” и “… ” в начале
reclosedev
Хм, с (?<=\B) я перемудрил. Подумал, что первую последовательность нельзя трогать.
nightvi
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
reclosedev
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/
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