Как вернуть список словарей из совпадения regex.findall? - PullRequest
0 голосов
/ 25 января 2019

Я работаю над несколькими сотнями документов и пишу функцию, которая найдет конкретные слова и их значения и выдаст список словарей.

Я специально ищу конкретную информацию («город» и число, которое к нему относится).Однако в некоторых документах у меня есть один город, а в других - двадцать, а то и сто, поэтому мне нужно что-то очень общее.

Текстовый пример (скобки запутаны так):

text = 'The territory of modern Hungary was for centuries inhabited by a succession of peoples, including Celts, Romans, Germanic tribes, Huns, West Slavs and the Avars. The foundations of the Hungarian state was established in the late ninth century AD by the Hungarian grand prince Árpád following the conquest of the Carpathian Basin. According to previous census City: Budapest (population was: 1,590,316)Debrecen (population was: 115,399)Szeged (population was: 104,867)Miskolc (population was: 109,841). However etc etc'

или

text2 = 'About medium-sized cities such as City: Eger (population was: 32,352). However etc etc'

Используя регулярное выражение, я нашел искомую строку:

p = regex.compile(r'(?<=City).(.*?)(?=However)')
m = p.findall(text)

Возвращает весь текст в виде списка.

[' Budapest (population was: 1,590,316)Debrecen (population was: 115,399)Szeged (population was: 104,867)Miskolc (population was: 109,841). ']

Так вот, вот где я застрял, и я не знаю, как поступить.Должен ли я использовать regex.findall или regex.finditer?

Учитывая, что количество «городов» в документах различается, я хотел бы получить список словарей.Если я бегу в тексте 2, я получу:

d = [{'cities': 'Eger', 'population': '32,352'}] 

Если я бегу в тексте один:

d = [{'cities': 'Szeged', 'population': '104,867'}, {'cities': 'Miskolc': 'population': 109,841'}]

Я действительно ценю любую помощь, ребята!

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Очень хороший ответ от @Wiktor. Поскольку я трачу некоторое время на это, я публикую свой ответ.

d = [' Budapest (population was: 1,590,316)Debrecen (population was: 115,399)Szeged (population was: 104,867)Miskolc (population was: 109,841). ']
oo = []
import re
for i in d[0].split(")"):
    jj = re.search("[0-9,]+", i)
    kk, *xx = i.split()
    if jj:
        oo.append({"cities": kk , "population": jj.group()})
print (oo)

#Result--> [{'cities': 'Budapest', 'population': '1,590,316'}, {'cities': 'Debrecen', 'population': '115,399'}, {'cities': 'Szeged', 'population': '104,867'}, {'cities': 'Miskolc', 'population': '109,841'}]
0 голосов
/ 25 января 2019

Вы можете использовать re.finditer с регулярным выражением с именами групп захвата (названных в соответствии с вашими ключами) в сопоставленном тексте с x.groupdict(), чтобы получить словарь результатов:

import re
text = 'The territory of modern Hungary was for centuries inhabited by a succession of peoples, including Celts, Romans, Germanic tribes, Huns, West Slavs and the Avars. The foundations of the Hungarian state was established in the late ninth century AD by the Hungarian grand prince Árpád following the conquest of the Carpathian Basin. According to previous census City: Budapest (population was: 1,590,316)Debrecen (population was: 115,399)Szeged (population was: 104,867)Miskolc (population was: 109,841). However etc etc'
p = re.compile(r'City:\s*(.*?)However')
p2 = re.compile(r'(?P<city>\w+)\s*\([^()\d]*(?P<population>\d[\d,]*)')
m = p.search(text)
if m:
    print([x.groupdict() for x in p2.finditer(m.group(1))])

# => [{'population': '1,590,316', 'city': 'Budapest'}, {'population': '115,399', 'city': 'Debrecen'}, {'population': '104,867', 'city': 'Szeged'}, {'population': '109,841', 'city': 'Miskolc'}]

См. Демоверсию Python 3 онлайн .

Второе p2 регулярное выражение

(?P<city>\w+)\s*\([^()\d]*(?P<population>\d[\d,]*)

См. Демонстрационную версию regex .

Здесь

  • (?P<city>\w+) - группа "город": 1+ слово chars
  • \s*\( - 0+ пробелов и (
  • [^()\d]* - любые 0+ символов кроме ( и ) и цифры
  • (?P<population>\d[\d,]*) - группа "население": цифра, за которой следуют 0+ цифр или / и запятые

Вы можете попытаться выполнить регулярное выражение p2 для всей исходной строки (см. demo ), но оно может быть не таким.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...