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

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

03.02.2014, 23:25. Показов 4819. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru