Skip to main content
 首页 » 编程设计

python之如何标记正则表达式模式并对结果列表进行排序

2024年09月03日28shanyou

我有一个看起来像这样的文件:

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', ... 

您可以使模式更健壮,以跟踪逗号、有效标识符等。