Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 10, 2015 05:46:07

Kir@
Зарегистрирован: 2015-08-13
Сообщения: 124
Репутация: +  0  -
Профиль   Отправить e-mail  

python 3.5.0a1 + regex + обработка исключений

У меня по исследуемой html странице есть таблицы, но т.к. я художник и я так вижу я пошел путем, котором вы, метры пайтона, если и баловались, то на заре своего обучения, прошу вот еще с чем помочь.
Есть таблица, я ее отформатировал и получил строку sovlad:
{ <> Иванов Анатолий Афанасьевич <> место <> 9 000 <> 90 <> 23.12.2002 <> Иванова Нина Иосифовна <> <> 1 000 <> 10 <> 23.12.2002 <><>< 0>К содержанию <1 > <> Совладельцы (источник: ГМЦ Росстата) </1> < > <> <> < > <> < “-: -: 10 : 000000 -: ”> Дата обновления в 07.07.2014 < “ ” “:100%-:”> < “ ” > < “:30%”> Наименование < “:30%”> }

Если записать построчно, то:
<> Иванов Анатолий Афанасьевич <> место <> 9 000 <> 90 <> 23.12.2002
<> Иванова Нина Иосифовна <> место <> 1 000 <> 10 <> 23.12.2002

Таких строк может быть 20, а может не быть ни одной, значит надо циклом пройти, да?
Пробую так:

pattern=r'(<>(?:([А-я\s]*)<>([А-я\s.,]*)<>(?:[\d\s]*)[<>\s]*([\d]+)[<>\s]*[\d.\s]*))'
for line in sovlad:
    FIO, Mesto, Chast=re.search(pattern, sovlad).groups()
    if line:
        print('FIO={}, Mesto={}, Chast={}.'.format(FIO, Mesto, Chast))
    else:
        print('Error: ')
Выдает ошибку too many values to unpack (expected 3)

Отредактировано Kir@ (Сен. 10, 2015 05:47:20)

Офлайн

#2 Сен. 10, 2015 10:19:41

Kir@
Зарегистрирован: 2015-08-13
Сообщения: 124
Репутация: +  0  -
Профиль   Отправить e-mail  

python 3.5.0a1 + regex + обработка исключений

Указанную выше строку обработал так:

pattern=r'<>(?:([А-я\s]*)<>([А-я\s.,]*)<>(?:[\d\s]*)[<>\s]*([\d]+)[<>\s]*[\d.\s]*)'
a=re.findall(pattern, sovlad)
for match in a:
    print(match)
Выдает:
(' Иванов Анатолий Афанасьевич ‘, ’ место ‘, ’90')
(' Иванова Нина Иосифовна ‘, ’ ‘, ’10')

В принципе, нормально, но мне бы с полученными данными действия совершать надо: сложить, отнять и прочие. как это сделать?

Офлайн

#3 Сен. 10, 2015 10:33:05

Kir@
Зарегистрирован: 2015-08-13
Сообщения: 124
Репутация: +  0  -
Профиль   Отправить e-mail  

python 3.5.0a1 + regex + обработка исключений

a=re.finditer(pattern, sovlad)
for match in a:
    print(match.group(1), ", местонахождение:", match.group(2), " (", match.group(3), "%)")

Иванов Анатолий Афанасьевич , местонахождение: место ( 90 %)
Иванова Нина Иосифовна , местонахождение: ( 10 %)

Офлайн

#4 Сен. 10, 2015 10:54:57

Kir@
Зарегистрирован: 2015-08-13
Сообщения: 124
Репутация: +  0  -
Профиль   Отправить e-mail  

python 3.5.0a1 + regex + обработка исключений

Итак, есть строка. С нее надо получить переменные, которыми потом можно оперировать.

sovlad='{    <> Иванов Анатолий Афанасьевич <> место <> 9 000 <> 90 <> 23.12.2002   <> Иванов Нина Иосифовна <> <> 1 000 <> 10 <> 23.12.2002      <><>< 0>К содержанию  <1 > <> Совладельцы (источник: ГМЦ Росстата) </1> <    > <> <> <    > <> < "-: -: 10 : 000000 -: "> Дата обновления в СПАРК: 07.07.2014    < " "    ":100%-:"> < " " > < ":30%"> Наименование < ":30%"> }'
pattern=r'<>(?:([А-я\s]*)<>([А-я\s.,]*)<>(?:[\d\s]*)[<>\s]*([\d]+)[<>\s]*[\d.\s]*)'
dano=re.M | re.S | re.U
object = re.compile(pattern, dano)
result=object.finditer( sovlad )
group_name_by_index = dict( [ (v, k) for k, v in object.groupindex.items() ] )
print (group_name_by_index)
for match in result:
    for group_index, group in enumerate(match.groups()):
        if group:
            print(group)
Получаю:
{}
Иванов Анатолий Афанасьевич
место
90
Иванова Нина Иосифовна

10

Как теперь оперировать с полученными строками?

Офлайн

#5 Сен. 11, 2015 02:54:03

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

python 3.5.0a1 + regex + обработка исключений

Ну что? Созрел для lxml или bs? Этот способ, который ты выбрал, - неправильный путь.



Офлайн

#6 Сен. 11, 2015 03:59:15

Kir@
Зарегистрирован: 2015-08-13
Сообщения: 124
Репутация: +  0  -
Профиль   Отправить e-mail  

python 3.5.0a1 + regex + обработка исключений

py.user.next
Созрел для lxml или bs?
Нет, но узнал чем finditer отличается от findall и search.
py.user.next
способ, который ты выбрал, - неправильный путь.
Это мой путь. И он правильный, пусть только с моей точке зрения.

Приведенный выше вопрос - последний. Все остальное у меня парсится отлично и со свистом.

Офлайн

#7 Сен. 11, 2015 05:07:49

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

python 3.5.0a1 + regex + обработка исключений

Kir@
Это мой путь. И он правильный, пусть только с моей точке зрения.
Мы это всё проходили на своём опыте. Польза, конечно, есть, но времени тратится много - пропорционально количеству неправильных путей.



Офлайн

#8 Сен. 11, 2015 06:42:04

Kir@
Зарегистрирован: 2015-08-13
Сообщения: 124
Репутация: +  0  -
Профиль   Отправить e-mail  

python 3.5.0a1 + regex + обработка исключений

Переделал код на

dano=re.M | re.S | re.U
object = re.compile(pattern, dano)
result=object.findall( sovlad )
group_name_by_index = dict( [ (m, s, u) for m, s, u in object.groupindex.items() ] )
for match in result:
    for group_index, group in enumerate(match):
        if group:
            print(group)
Как между полученными группами знаки поставить, чтобы вот так было:
Иванов Анатолий Афанасьевич, место , (90%)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version