Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.84/25: Рейтинг темы: голосов - 25, средняя оценка - 4.84
55 / 55 / 16
Регистрация: 25.03.2013
Сообщений: 178

Задача на регулярные выражения (найти и преобразовать суммы денег и даты)

03.02.2014, 23:25. Показов 4796. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Текстовый файл in.txt содержит текст на английском языке, в котором присутствуют:
– корректные даты в формате деньXмесяцXгод, где день и месяц – одна или две цифры, год – две или четыре цифры. X – разделитель: точка, прямой слеш или минус (одинаковый в каждой дате, но может быть разным в разных датах).
– корректные денежные суммы в формате сумма belarusian roubles или сумма blr, где cумма – число, разбитое на разряды произвольным числом пробелов (например, 32 671 000 blr).
Программа должна сделать следующее:
1.Преобразовать даты в тексте в американский формат Month day, year (например, October 3, 2010).
2.Убрать пробелы между разрядами в суммах (например, 32671000 blr).
Результат записать в файл out.txt.
Пример

Пример in.txt
I was 2 300 530 belarusian roubles and 2 351 dollars 12/9/2010.
After shopping 15.09.10
I was left with 1 700 253 blr and 2 000$.
After shopping 16.09.10
I was left with 1 7 00 2 500 blr.
232 500 blr and 10 blr.

Результат out.txt
I was 2300530 belarusian roubles and
2 351 dollars September 12, 2010.
After shopping September 15, 2010
I was left with 1700253 blr and 2 000$.
After shopping September 16, 2010
I was left with 1 7 00 2500 blr.
232500 blr and 10 blr.

Замечания к задаче от препода

Алгоритм анализа и редактирования текста исходного файла состоит из двух циклов. Сначала строка прогоняется через первое регулярное выражение (даты), а затем через второе (деньги). Структура циклов одинаковая, и код отличается лишь отдельными строками.
Хорошее решение (в стиле ООП) предполагает создание абстрактного класса, в котором есть универсальный метод с реализацией цикла для поиска и замены в переданной строке по регулярному выражению. Детали обработки, уникальные для регулярного выражения, должны быть вынесены в подклассы.

Мой код

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# -*- coding:utf-8 -*-
# using python 2.7.3
'''File 'in.txt' contents text on english language (including correct 
dates and the amount of money). Program converts dates in 
american format (ex: October 3, 2010) and del extra whitespace
in sums.'''
import re
 
def month_replace(match):
    '''Function returns the month letters, number and year '''
    dict_months = {1:"January", 2:"February", 3:"March", 4:"April", 
    5:"May", 6:"June", 7:"July", 8:"August", 9:"September", 
    10:"October", 11:"November", 12:"December" }
    value_month = dict_months[int(match.group('month'))]
    value_day = str(int(match.group('day')))
    if len(match.group('year')) == 4:
        value_year = match.group('year')
    elif len(match.group('year')) == 2 and 0<int(match.group('year'))<15:
        value_year = '20'+match.group('year')
    else:
        value_year = '19'+match.group('year')
    return '{month} {day}, {year}'.format(month=value_month, 
        day=value_day, year=value_year)
 
def money_replace(match):
    '''Function returns the correct amount of money '''
    value_money = ''.join(match.group('money').split(' '))
    return '{money} {br}'.format(money=value_money, br=match.group('BR'))
 
money_string = re.compile(r"(?P<money>(\d+\s+)+)"
    r"(?P<BR>\bbelarusian roubles\b|\bblr\b)")
date_string = re.compile(r"(?P<day>\d{1,2})(?P<delimiter>[-./])"
    r"(?P<month>\d{1,2})(?P=delimiter)(?P<year>\d{4,4}|\d{2,2})")
with open('in.txt','r+b') as input_file:
    f = input_file.read()
    f = date_string.sub(month_replace,f)
    f = money_string.sub(money_replace,f)
    input_file.seek(0)
    input_file.write(f)

Вопросы:
Вывод осуществлял в тот же файл, вопрос правильно ли? Про циклы в замечаниях не понял, думаю они будут избыточны или просто нужно было считывать файл построчно, мол так меньше памяти жрёт? И про класс вместе с ООП тоже не догнал, может кто пояснит как здесь можно применить, а то меня слегка тупит.
Ну и главное правильно ли я составил регулярное выражение, вроде протестил - работает для всех вариантов.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.02.2014, 23:25
Ответы с готовыми решениями:

Регулярные выражения. Найти в тексте даты вида дд.мм.гггг
Найти в тексте даты вида дд.мм.гггг (например 13.10.2013). Исходить из предположения что все даты в тексте валидные (т.е. нет таких...

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

Регулярные выражения для проверки даты
Есть регулярное выражение для проверки даты в формате DD/MM/YYYY: (0||3)(0|1)(19|20)\d\d Можете привести простенький код,чтобы понять как...

3
 Аватар для Wolkodav
842 / 480 / 58
Регистрация: 18.09.2012
Сообщений: 1,688
04.02.2014, 11:23
Zarex, ну конечно регулярки это хорошо, но можно было тут почитай, неплохо написано про управления с datetime или тут, дальше. Конечно регулярками убирать пробелы это не самое лучшее решение, если честно, можно проще гораздо использую строковые функции. Или вам принципиальны регулярки?
1
55 / 55 / 16
Регистрация: 25.03.2013
Сообщений: 178
04.02.2014, 12:47  [ТС]
Wolkodav, спасибо за линк, про time знал, с модулем datetime не сталкивался. А что касается рег экспов, то по заданию нужно использовать именно их, поэтому так и делал. Честно говоря у меня это первое использование РВ.
0
 Аватар для Wolkodav
842 / 480 / 58
Регистрация: 18.09.2012
Сообщений: 1,688
04.02.2014, 21:28
Zarex, А про ООП, то будет надуманно немного, если честно.. Но сделать класс валюта или рубли, и сделать класс американское время какое-нибудь, сделать еще один класс, типо фабрики, туда скармливаешь свой текст, он его делит на дату и деньги, отдаёт дату классу американское время, а деньги классу валюта или рубли и на выходе получаешь готовый объект)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.02.2014, 21:28
Помогаю со студенческими работами здесь

Поиск даты в тексте, регулярные выражения
Ребят, никак не могу разобраться с регулярками, хочу в строке найти числа вида 12 12 12 (дата), и если нету между ними точек то поставить...

Регулярные выражения для даты в формате дд.мм.гггг
В сообщении может содержать дата в формате дд.мм.гггг. где дд - число из диапазона от 1 до 31, мм - целое число из диапазона от 1 до 12, а...

Регулярные выражения: извлечение даты и времени из строки
Какое регулярное выражение поможет вытащить из строки типа &quot;Arrival Time: Feb 23, 2019 18:32:48.607631000&quot; строку ...

ЧПУ. Замена строк, регулярные выражения. Как правильно использовать переменную в регулярные выражения ?
Здравствуйте! Решил реализовать ЧПУ на своем сайте. Первый этап это замена всех реальных ссылок на чпу ссылки. Так вот при замене я...

Задача на регулярные выражения
Найдите слова в которых есть русская буква, а когда-нибудь за ней цифра. Что не так: def Russian_and_number(string: str) -&gt;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru