将两个Python列表与正则表达式匹配,并创建字典输出

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)

Iva*_*nko 5

尝试:

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)