0

希望这是一个简单的问题:

这是我的字典temp = {'0.1995': ['in1', 'in2'], '0.399': ['in0', 'y']})

搜索文件的代码:

for line in SPFFile:
    temp_dict = temp            
    for val in temp_dict.itervalues():      
    if re.search(val.upper(),line) and ((re.search("^R",line) or re.search("^C",line))):
         print "value found!"

我的问题是 val 是一个列表,例如 ['in1','in2'] 而我需要 val 是 'in1' 然后是 'in2' 等等。

另外,如果我不应该使用字典来执行此操作,请告诉我。该词典由两个列表组成。

4

2 回答 2

2
  • 虽然您当然可以牺牲可读性来换取性能,但请尝试使用一个正则表达式而不是三个。因此,例如:

    if re.match('[RC].*(?:%s)' % '|'.join(map(re.escape, val), line):
        print "value found!"
    

    假设“R”或“C”不是val您要匹配的项目的一部分,将一步完成您在上面描述的操作。如果是,您可以改用前瞻:

    if re.match('(?=.*%s)[RC]' % '|'.join(map(re.escape, val), line):
        print "value found!"
    
  • temp_dict = temptemp除非您计划稍后重新分配到某个地方,否则不会做任何事情;它只是给出了temp一个新名称的内容。您也可以考虑为变量赋予比temp和更有意义的名称val

  • 虽然re模块中内置了正则表达式缓存,但您应该养成编译将重复使用的正则表达式的习惯,因为它会给您带来显着的性能优势。这是我的风格,对你来说可能过于冗长:

    RE_BEGINS_WITH_R_OR_C = re.compile('^[RC]')
    

    当然,如果您每次通过循环都使用新的正则表达式,那么这样做是没有意义的......但是如果在上面的代码中,如果您只关心一个项目匹配,而不是哪个项目匹配,那么您可以使用此答案展平列表列表(嵌套列表理解语法令人困惑,我不会争论:-),编译单个正则表达式并将用于文件的每一行。

  • 请注意 和之间的区别re.matchre.searchre.search可以使用时无需锚定re.match

一般来说,阅读文档!不算太差!您可能会先查看您正在使用的 Python 的各个部分(字符串、列表、字典和正则表达式)。

于 2013-01-15T05:02:23.167 回答
2

将您的内部for循环更改为:

for key, vals in temp_dict.items():
    if re.search('|'.join(vals)):
        #do stuff here

至于首先使用字典,这完全取决于您是否需要像上面那样通过键组织值。如果您只是想检查给定行中是否存在任何值,最好将'|'.join()所有值放在一起并将结果字符串用作搜索表达式。

于 2013-01-15T04:55:59.890 回答