Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 21, 2012 22:45:09

Razor
Зарегистрирован: 2012-09-11
Сообщения: 127
Репутация: +  2  -
Профиль   Отправить e-mail  

Парсер по тексту

Здраствуйте, уважаемые форумчане. Недавно пытался написать простой текст, который бы вырезал из файла номера страниц и колонтикулы (очевидно, остались от сканирования), но возникли проблемы. Долго думал, как организовать работу (я новичек) и получилось нечто эдакое - через списки:

# -*- coding: utf-8 -*-
# Список исключений
list_ex = []
for num_ex in range(13, 20): list_ex.append(repr(num_ex) + "")
print list_ex
# Файловый список
input_file = open('read1.txt', 'r')
list_text = []
for line in input_file: list_text.append(line.rstrip())
print list_text
# Очистка от номера страницы
list_clear = []
for words in list_text:
    if words not in list_ex != True:
        list_clear.append(words)
print list_clear
# Вывод в файл
output_file = open('clear_text.txt', 'w')
for clear_words in list_clear: output_file.write(clear_words.strip() + '\n')

Все бы хорошо: парсит строку - если только номер - удаляет, но бывает, что номер страницы сдвинут. Вот и возникли вопросы:
1) Как достать с файла номера страниц (просто представьте отсканированную книгу и поймете)
2) Как удалить двойной Enter в тексте методами Питона?

Были пару размышлений:
1) Пропарсить страницу побуквенно.
2) Вшить вот такой код, дабы из побуквенного не удалил ничего лишнего (оставит весь текст без цифр ведь):
list_clear = []
for words in list_text:
    if words not in list_ex[0] != True:
        list_clear.append(words)
        list_ex.pop(0)
    else:
    	num_text = list_text.count(words)
    	num_ex = list_ex.count(num_text) + 1
    	list_ex.pop(:num_ex)

Офлайн

#2 Окт. 21, 2012 23:52:17

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

Парсер по тексту

import re

is_numeric_re = re.compile('\d+')

with open('text_to_clear.txt') as fd:
lines = map(str.strip, fd)
dest = []
skip_next = False

total = len(lines) - 1
for idx, ln in enumerate(lines):
if skip_next:
skip_next = False
continue
if ln and is_numeric_re.match(ln) is None:
dest.append(ln)
elif (idx < total) and lines[idx + 1]:
dest.append(ln)
else:
skip_next = True
print '\n'.join(dest)

Офлайн

#3 Окт. 22, 2012 01:23:02

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

Парсер по тексту

s0rg
lines = map(str.strip, fd)
все отступы будут удалены

Razor
2) Как удалить двойной Enter в тексте методами Питона?
удалить или сжать до одного переноса ?

Razor
Были пару размышлений:
1) Пропарсить страницу побуквенно.
есть re.sub(), за два прохода можно сделать и то, и другое



Офлайн

#4 Окт. 22, 2012 01:25:26

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

Парсер по тексту

py.user.next
все отступы будут удалены
Точно )

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version