Найти - Пользователи
Полная версия: Парсинг текста (how to?)
Начало » Python для новичков » Парсинг текста (how to?)
1
sablast
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()
Так что остается один вопрос, достаточно ли это правильный подход? или же надо как то по-другому?
doza_and
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”) при открытии. Пока вам повезло что все нормально прошло.
sablast
doza_and
можно использовать pyparsing
спасибо за наводку, буду учить
py.user.next
Там можно искать строки вида:
от 30 января 2015 г.        г. Тамбов                       № 1374
и брать всё вокруг них.

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

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

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