Найти - Пользователи
Полная версия: python 3.5.0a1 + regex + обработка исключений
Начало » Python для новичков » python 3.5.0a1 + regex + обработка исключений
1 2 3
Kir@
У меня по исследуемой 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@
Указанную выше строку обработал так:
pattern=r'<>(?:([А-я\s]*)<>([А-я\s.,]*)<>(?:[\d\s]*)[<>\s]*([\d]+)[<>\s]*[\d.\s]*)'
a=re.findall(pattern, sovlad)
for match in a:
    print(match)
Выдает:
(' Иванов Анатолий Афанасьевич ‘, ’ место ‘, ’90')
(' Иванова Нина Иосифовна ‘, ’ ‘, ’10')

В принципе, нормально, но мне бы с полученными данными действия совершать надо: сложить, отнять и прочие. как это сделать?
Kir@
a=re.finditer(pattern, sovlad)
for match in a:
    print(match.group(1), ", местонахождение:", match.group(2), " (", match.group(3), "%)")

Иванов Анатолий Афанасьевич , местонахождение: место ( 90 %)
Иванова Нина Иосифовна , местонахождение: ( 10 %)
Kir@
Итак, есть строка. С нее надо получить переменные, которыми потом можно оперировать.
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

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

Приведенный выше вопрос - последний. Все остальное у меня парсится отлично и со свистом.
py.user.next
Kir@
Это мой путь. И он правильный, пусть только с моей точке зрения.
Мы это всё проходили на своём опыте. Польза, конечно, есть, но времени тратится много - пропорционально количеству неправильных путей.
Kir@
Переделал код на
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%)
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