1

我有以下两个列表:

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每个输入元素旁边的值中检索相应的匹配元素:

combined = "(" + ")|(".join(ref) + ")"

l = []

for i in input:
    if re.findall(combined,i):
         l.append(i)
...
MAPLEWOOD AVE
LYNNDALE
4

2 回答 2

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 ])

或者,如果您使用的是 Python 3:

output = { i : [ r for r in ref if re.match(r, i) ] for i in input }

你也可以编译你的正则表达式来加速它们:

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 }

UPD: 也许您想使用匹配的部分作为值,而不是模式:

output = { i : [ r.match(i).group(0) for r in ref_re if r.match(i) ] for i in input }
于 2013-01-13T22:21:32.823 回答
0

我认为您错过了正则表达式中的空格。试试这个方法:

ref = ['LYNNDALE\s*(?:RD)?', 'HOMAN\s*(?:AVE)?', 'MAPLEWOOD\s*(?:AVE)?', 'LYNNDALE\s*(?:LN)?']
于 2013-01-13T22:13:16.487 回答