我有一个看起来像这样的文件:
select a,b,c FROM Xtable
select a,b,c FROM Vtable
select a,b,c FROM Atable
select a,b,c FROM Atable
select d,e,f FROM Atable
我想得到一个 sortedMap:
{
"Atable":["select a,b,c FROM Atable", "select d,e,f FROM Atable"],
"Vtable":["select a,b,c FROM Vtable"],
"Xtable":["select a,b,c FROM Xtable"]
}
sortedMap 的键是表名,值是列表中的文本行。
我从这个开始,但坚持对正则表达式匹配的行进行标记:
import re
f = open('mytext.txt', 'r')
x = f.readlines()
print x
f.close()
for i in x:
p = re.search(".* FROM ", i)
//now how to tokenize and get the value that follows FROM
请您参考如下方法:
您可以结合使用 defaultdict 和正则表达式。让 lines 成为你的线路列表:
from collections import defaultdict
pattern = "(select .+ from (\S+).*)"
results = defaultdict(list)
for line in lines:
query, table = re.findall(pattern, line.strip(), flags=re.I)[0]
results[table].append(query)
实际上,读取文件的正确方法是:
with open('mytext.txt') as infile:
for line in infile:
query, table = re.findall(pattern, line.strip(), flags=re.I)[0]
results[table].append(query)
结果自然是一个 defaultdict。如果要将其转换为有序字典,调用字典构造函数:
from collections import OrderedDict
OrderedDict(sorted(results.items()))
#OrderedDict([('Atable', ['select a,b,c FROM Atable', ...
您可以使模式更健壮,以跟踪逗号、有效标识符等。
