Python Dictionary缺少键,值迭代

时间:2014-10-15 22:16:12

标签: python regex

我设置了一个小功能来在一行上运行一个可配置的正则表达式列表,到目前为止我有两个正则表达式,但它似乎只执行了一个与正则表达式相关的模式,这里'我的代码。

def run_all_regex(self, line):

regexp: {
    'regex1' : 'complicated regex',
    'regex2' : 'complicated regex2',
}

for key, pattern in regexp.iteritems():

   m = match(pattern, line)

   if m:
      x = line
   else:
      x = None 

  return x

我在for,key ...之后添加了一个print语句,以查看正在打印的图案,而这只是第二个!删除第二个后,第一个打印出来!是什么给了什么?

编辑:

所以我已经看到我的回复陈述使我的功能陷入困境,我想详细说明我在这里尝试做什么。

基本上我打开一个文件,逐行读取,并且对于运行此函数的每一行,将运行该行的两个(到目前为止)正则表达式,如果该行与正则表达式匹配,则将其返回到键在一个字典中。这是代码。

for key in dict:
   with open(key) as f:
      for line in f:
          dict[key] = self.run_all_regex(line)

所以在最后,dict [key]应该是一行,与run_all_regex部分中的正则表达式相匹配。

3 个答案:

答案 0 :(得分:3)

return x在第一次迭代后结束你的for循环。

答案 1 :(得分:1)

def run_all_regex(self, line):
    regexp = {
        'regex1' : 'complicated regex',
        'regex2' : 'complicated regex2',
    }
    results = {}
    for key, pattern in regexp.iteritems():
        m = match(pattern, line)
        if m:
            results[key] = line
        else:
            results[key] = None
    return results

这将返回一个字典,每个正则表达式的结果都存储为值,而键是正则表达式字典中的键。

答案 2 :(得分:0)

我不确定你想要达到什么目标,但是如果能够详细说明并解释更多你期望的内容,你可以编写更好的代码吗?

import re
def run_all_regex(line):
    regexp= {'regex1' : 'complicated regex','regex2' : 'complicated regex2'}

    for key, pattern in regexp.iteritems(): 
        m = re.match(pattern, line)
        if m:
            x = line
        else:
            x = None 

    return x

print run_all_regex('complicated regex')

如果您想使用列表理解,而不是每次都返回:

res= [re.match(pattern, line) for x in regexp.iteritems()]

您可以根据需要考虑使用“Any Operatorother operator

 res= Any(re.match(pattern, line) for x in regexp.iteritems())

我建议还检查re.match以了解正则表达式是什么(如果您正在测试此算法以学习正则表达式,以及如何在两个项目之间进行匹配)。


第二个答案基于您编辑过的问题 让我们以这个快速而小的例子来阐明在匹配项目中使用正则表达式

让我们举一个例子,看看我们是否可以验证两个单词是否以" a"开头。

Pattern ::(a \ w +)\ W(a \ w +)

l= ["animal alfa", "do don't"]

for element in l:
    # Match if two words starting with letter d.
    m = re.match("(a\w+)\W(a\w+)", element)

    # See if success.
    if m:
        print(m.groups())

预期产出:('动物',' alfa')

2-让我们概括一下检查不同正则表达式的想法

# Split text to store every line in the list.

text= """
dog dot\n say said \n bolo bala \n no match
"""
l= "\n".split(text)
#Output
#l = ["dog dot", "say said", "bolo bala", "no match"]

# Try to make some RE patterns for test 
regex1 : verify if two words starts with d
regex2 : verify if two words starts with s
regex3 : verify if two words starts with b

regexp= {'regex1' : "(d\w+)\W(d\w+)",'regex2' : "(s\w+)\W(s\w+)",'regex3' : "(b\w+)\W(b\w+)"}

# Loop in list of items
for element in l:
    # Match if two words starting with letter d. It produces a list of booleans (True if there is match, False if not, indexed based on the order of regexp)
    m = [re.match(reg, element) for re in regexp.iteritems()]

    # if v is true (the result of re.match(reg, element)), we store the index, and group using tuple
    listReg= [ (i,v.groups()) for i,v in enumerate(m) if v] 

我希望它能帮助您了解如何解决您的问题(不确定我是否理解所有问题)。