从已知的字符串布局中提取数据

时间:2018-12-04 02:28:27

标签: python regex

我有一个名为example.txt的文件:

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

我的目标是从每个数据元素中提取nameage。我的结果应如下所示:

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 :(得分:0)

尝试一下:

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)

答案 1 :(得分:0)

或者为什么不这样做:

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)

是:

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

答案 2 :(得分:0)

您将需要两个匹配组,一个用于名称,另一个用于年龄。 因此,您的正则表达式模式应如下所示:

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

组括号(\w+)查找一个或多个单词字符。就您而言,这同时适用于nameage

尝试一下:

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

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

输出:

<data name="Jason" age="24">
[('Jason', '24')]
 <data name="Michelle" age="30">
[('Michelle', '30')]
 <data name="Steve" age="41">
[('Steve', '41')]