use*_*790 1 python regex dictionary
我有以下两个列表:
input = ['MAPLEWOOD AVE', 'LYNNDALE ', 'SUGAR DR']
ref = ['LYNNDALE (?:RD)?', 'HOMAN (?:AVE)?', 'MAPLEWOOD (?:AVE)?', 'LYNNDALE (?:LN)?']
我想查找inputwith中每个元素的所有匹配项ref。输出将是一个字典,每个键是一个input元素,每个值是一个ref与相应input元素匹配的元素,如下所示:
{'MAPLEWOOD AVE' : 'MAPLEWOOD AVE', 'LYNNDALE ' : 'LYNNDALE RD', 'LYNNDALE LN', 'SUGAR DR':}
以下内容使我可以迭代input查找其中的findall匹配项ref(其中包含嵌入式正则表达式分组)。但是,我无法从ref每个输入元素旁边作为值检索对应的match 元素:
combined = "(" + ")|(".join(ref) + ")"
l = []
for i in input:
if re.findall(combined,i):
l.append(i)
...
MAPLEWOOD AVE
LYNNDALE
Run Code Online (Sandbox Code Playgroud)
尝试:
import re
input = ['MAPLEWOOD AVE', 'LYNNDALE ', 'SUGAR DR']
ref = ['LYNNDALE (?:RD)?', 'HOMAN (?:AVE)?', 'MAPLEWOOD (?:AVE)?', 'LYNNDALE (?:LN)?']
output = dict([ (i, [ r for r in ref if re.match(r, i) ]) for i in input ])
Run Code Online (Sandbox Code Playgroud)
或者,如果您使用的是Python 3:
output = { i : [ r for r in ref if re.match(r, i) ] for i in input }
Run Code Online (Sandbox Code Playgroud)
另外,您可以编译正则表达式以加快它们的速度:
ref_re = [ re.compile(r) for r in ref ]
output = { i : [ r.pattern for r in ref_re if r.match(i) ] for i in input }
Run Code Online (Sandbox Code Playgroud)
UPD: 也许您想将匹配的部分用作值,而不是模式:
output = { i : [ r.match(i).group(0) for r in ref_re if r.match(i) ] for i in input }
Run Code Online (Sandbox Code Playgroud)