Извлечение данных из известного макета строки - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть следующий файл с именем example.txt:

<data name="Jason" age="24">
<data name="Michelle" age="30">
<data name="Steve" age="41">

Моя цель - извлечь name и age из каждого элемента данных.Мой результат должен выглядеть примерно так:

result = [('Jason', 24), ('Michelle', 30), ('Steve', 41)]

Я предполагаю, что мне нужно использовать регулярные выражения для выполнения этой задачи.Вот что у меня пока есть, но не повезло:

import re

with open('example.txt') as f:
    data = f.readlines()
    for d in data:
        pattern = re.compile(r'name="(\w)"')
        matches = pattern.finditer(d)
        for m in matches:
            print(m)

Есть идеи, что я делаю не так?

Ответы [ 3 ]

0 голосов
/ 04 декабря 2018

Или почему бы просто:

import re
with open('example.txt') as f:
   l=[tuple(re.findall('".*"',i)[0].replace('"','').split(' age=')) for i in f]

Понимание списка.

Если вас волнует, что вторым элементом является строка, выполните дополнительные:

l=[(i[0],int(i[1])) for i in l]

Итеперь все-таки:

print(l)

Is:

[('Jason', 24), ('Michelle', 30), ('Steve', 41)]
0 голосов
/ 04 декабря 2018

Вам понадобятся две группы совпадений, одна для имени, другая для возраста.Таким образом, ваш шаблон регулярного выражения должен выглядеть следующим образом:

name=\"(\w+)\".*age=\"(\w+)\"

Скобка группы (\w+) находит один или несколько символов слова.В вашем случае это применимо как к name, так и к age.

. Попробуйте:

pattern = re.compile(r'name=\"(\w+)\".*age=\"(\w+)\"')

for d in data:
    matches = re.findall(pattern, d)
    print(d)
    print(matches)

output:

<data name="Jason" age="24">
[('Jason', '24')]
 <data name="Michelle" age="30">
[('Michelle', '30')]
 <data name="Steve" age="41">
[('Steve', '41')]
0 голосов
/ 04 декабря 2018

Попробуйте это:

import re

r = re.compile('<data name="(.+)" age="([0-9]+)">')
results = []
with open('example.txt', 'r') as f:
    for line in f:
        match = re.search(r, line)
        results.append((match.group(1), match.group(2)))

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