【问题标题】:Match two Python lists with regular expressions, and create dictionary output用正则表达式匹配两个 Python 列表,并创建字典输出
【发布时间】:2012-12-27 19:59:20
【问题描述】:

我有以下两个列表:

input = ['MAPLEWOOD AVE', 'LYNNDALE ', 'SUGAR DR']

ref = ['LYNNDALE (?:RD)?', 'HOMAN (?:AVE)?', 'MAPLEWOOD (?:AVE)?', 'LYNNDALE (?:LN)?']

我想在inputref 中查找每个元素的所有匹配项。输出将是一个字典,其中每个键都是一个 input 元素,每个值都是一个与相应 input 元素匹配的 ref 元素,如下所示:

{'MAPLEWOOD AVE' : 'MAPLEWOOD AVE', 'LYNNDALE ' : 'LYNNDALE RD', 'LYNNDALE LN', 'SUGAR DR':}

以下内容允许我遍历input 以在ref 中搜索findall 匹配项(其中包含嵌入的正则表达式分组)。但是,我无法从 ref 检索相应的匹配元素作为每个输入元素旁边的值:

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

l = []

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

【问题讨论】:

    标签: python regex dictionary


    【解决方案1】:

    试试:

    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 }
    

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

    output = { i : [ r.match(i).group(0) for r in ref_re if r.match(i) ] for i in input }
    

    【讨论】:

    • 成功了!非常感谢伊万!你为我节省了很多时间
    【解决方案2】:

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

    ref = ['LYNNDALE\s*(?:RD)?', 'HOMAN\s*(?:AVE)?', 'MAPLEWOOD\s*(?:AVE)?', 'LYNNDALE\s*(?:LN)?']
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-10
      • 1970-01-01
      • 2015-09-30
      • 1970-01-01
      相关资源
      最近更新 更多