我有一个名为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)
知道我在做什么错吗?
答案 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+)
查找一个或多个单词字符。就您而言,这同时适用于name
和age
。
尝试一下:
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')]