RegEx для захвата групп с помощью словарного ключа - PullRequest
3 голосов
/ 14 апреля 2019

У меня проблемы с отображением правильного именованного захвата в моей функции словаря.Моя программа читает файл .txt, а затем преобразует текст в этом файле в словарь.У меня уже есть правильная формула регулярного выражения, чтобы захватить их.

Вот мой File.txt:

file Science/Chemistry/Quantum 444 1
file Marvel/CaptainAmerica 342 0
file DC/JusticeLeague/Superman 300 0
file Math 333 0
file Biology 224 1

Вот ссылка regex , которая может захватить те, которые я хочу:

Byпри просмотре ссылки, которую я хочу отобразить, подсвечивается зеленым и оранжевым.

Эта часть моего кода работает:

rx= re.compile(r'file (?P<path>.*?)( |\/.*?)? (?P<views>\d+).+')
i = sub_pattern.match(data) # 'data' is from the .txt file
x = (i.group(1), i.group(3))
print(x) 

Но так как я превращаю .txt в словарь, я не мог понять, как создать .group (1) или.Группа (3) в качестве клавиш для отображения специально для моей функции отображения.Я не знаю, как заставить эти группы отображаться, когда я использую print("Title: %s | Number: %s" % (key[1], key[3])), и он будет отображать это содержимое.Я надеюсь, что кто-то может помочь мне реализовать это в моей функции словаря.

Вот моя функция словаря:

def create_dict(data):
    dictionary = {}
    for line in data:
      line_pattern = re.findall(r'file (?P<path>.*?)( |\/.*?)? (?P<views>\d+).+', line)
      dictionary[line] = line_pattern
      content = dictionary[line]
      print(content)
    return dictionary

Я пытаюсь сделать мой вывод похожим на это из моего текстового файла:

Science 444
Marvel 342
DC 300
Math 333
Biology 224

Ответы [ 3 ]

1 голос
/ 14 апреля 2019

Вы уже использовали именованную группу в вашем 'line_pattern', просто поместите их в свой словарь. re.findall не будет работать здесь. Также символ экранирования '\' перед '/' является избыточным. Таким образом, ваша словарная функция будет:

def create_dict(data):
    dictionary = {}
    for line in data:
        line_pattern = re.search(r'file (?P<path>.*?)( |/.*?)? (?P<views>\d+).+', line)
    dictionary[line_pattern.group('path')] = line_pattern.group('views')
    content = dictionary[line]
    print(content)
    return dictionary
1 голос
/ 14 апреля 2019

Вы можете создать и заполнить словарь данными вашего файла, используя

def create_dict(data):
    dictionary = {}
    for line in data:
        m = re.search(r'file\s+([^/\s]*)\D*(\d+)', line)
        if m:
            dictionary[m.group(1)] = m.group(2)
    return dictionary

По сути, он выполняет следующие действия:

  • Определяет dictionary словарь
  • Считывает data построчно
  • Поиск совпадения file\s+([^/\s]*)\D*(\d+), и, если есть совпадение, два значения группы захвата используются для формирования пары ключ-значение словаря.

Регулярное выражение, которое я предлагаю:

file\s+([^/\s]*)\D*(\d+)

См. График Regulex , объясняющий это:

enter image description here

Затем вы можете использовать его как

res = {}
with open(filepath, 'r') as f:
    res = create_dict(f)
print(res)

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

0 голосов
/ 14 апреля 2019

Этот RegEx может помочь вам разделить ваши входные данные на четыре группы, где группа 2 и группа 4 - это ваши целевые группы, которые можно просто извлечь и разделить пробелом :

 (file\s)([A-Za-z]+(?=\/|\s))(.*)(\d{3})

enter image description here

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