Уведомления

Группа в Telegram: @pythonsu

#1 Март 29, 2015 20:35:20

sablast
Зарегистрирован: 2015-03-29
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг текста (how to?)

print ('Hello World!')

Всем привет! Я недавно начал изучать питон (просто для себя) и тут внезапно подвернулась задачка на работе к которой можно было бы приложить новые знания, но к сожалению их еще не хватает.

Задача в следующем, есть много текстовых файлов (примерно по 2Мб каждый, пример файла в приложении).
В файле находится некоторое количество законов/постановлений, надо разбить этот файл на отдельные файлы.
Выдергивать надо такого вида карточки:
————————————————–
№ 1
Состояние: Действует без изменений
Постановление Администрации Тамбовской области от 31.01.2015 № 76
О комиссии по обеспечению устойчивого развития экономики и
социальной стабильности в Тамбовской области
Текст документа (актуальная редакция):

АДМИНИСТРАЦИЯ ТАМБОВСКОЙ ОБЛАСТИ

ПОСТАНОВЛЕНИЕ

31.01.2015 г. Тамбов № 76

+—————————————————————–+
| О комиссии по обеспечению устойчивого развития экономики и |
| социальной стабильности в Тамбовской области |
+—————————————————————–+

Проблема в том, что такая конструкция “+—————————————————————–+” встречается не везде.

Основной вопрос же: можно ли файл считать не как list:
file.readlines()
, а как multiline строку вида:
file_in_string = ("""№ 1
                    Состояние: Действует без изменений
                    Постановление Администрации Тамбовской области от 31.01.2015 № 76
                    О  комиссии  по   обеспечению  устойчивого   развития  экономики   и
                    социальной стабильности в Тамбовской области
                    Текст документа (актуальная редакция):""") 
                    #и так далее весь файл
и уже с этой строкой работать с помощью регулярных выражений?
Или же я иду вообще по неверному пути?

P.S.
как сделать мультистроку уже нашел, все было на поверхности :
with open('in.txt','r') as myfile:
    data=myfile.read()
Так что остается один вопрос, достаточно ли это правильный подход? или же надо как то по-другому?

Отредактировано sablast (Март 29, 2015 20:55:10)

Прикреплённый файлы:
attachment in.txt (21,4 KБ)

Офлайн

#2 Март 29, 2015 21:30:21

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Парсинг текста (how to?)

2 мегабайта довольно скромный размер. Такие файлы я бы сам полностью в память грузил, как вы и сделали.

Регулярные выражения мощная штука, кроме нее можно использовать pyparsing. С его помощью проще написать более сложные шаблоны поиска для разделения документа на части. Если такие задачи часто встречаются то наверное надо будет проводить морфологический анализ. http://pymorphy2.readthedocs.org/en/latest/.

Я бы резал не по черточкам а по АДМИНИСТРАЦИИ ТАМБОВСКОЙ ОБЛАСТИ. т.е. по характерным формам заголовков (учитывая центрированность и характерные словосочетания).

При записи может потребоваться обратная операция -форматирование. Посмотрите jinja, mako.

Я не специалист по анализу текстов, знающие люди может еще чего подскажут.

sablast
with open('in.txt','r') as myfile:
data=myfile.read()

Рекомендую всегда указывать кодировку исходного файла (“cp1251”,“cp866”,“utf-8”) при открытии. Пока вам повезло что все нормально прошло.



Отредактировано doza_and (Март 29, 2015 21:34:47)

Офлайн

#3 Март 29, 2015 21:36:12

sablast
Зарегистрирован: 2015-03-29
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг текста (how to?)

doza_and
можно использовать pyparsing
спасибо за наводку, буду учить

Отредактировано sablast (Март 29, 2015 21:38:16)

Офлайн

#4 Март 30, 2015 00:58:53

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

Парсинг текста (how to?)

Там можно искать строки вида:

от 30 января 2015 г.        г. Тамбов                       № 1374
и брать всё вокруг них.

Вообще, при решении таких задач думай, как сам (своим мозгом) определяешь отдельные записи, потом выделяй этот алгоритм и реализуй его. Мозг тоже как бы не из космоса их разделять умеет, а действует по алгоритму.

sablast
и уже с этой строкой работать с помощью регулярных выражений?
Или же я иду вообще по неверному пути?
Вообще, не принято всё в память загружать, мало ли какой-то там размер может появиться. Программу надо делать так, будто файл будет бесконечным. Но реализация для бесконечной последовательности может быть сложнее.

sablast
Проблема в том, что такая конструкция “+—————————————————————–+” встречается не везде.
Вообще, лучше тогда все такие штуки предварительно почистить, чтобы их нигде не было (оттранслировать это дело в какой-то канонический вид).



Отредактировано py.user.next (Март 30, 2015 00:59:49)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version