希望这是一个简单的问题:
这是我的字典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'等等。
如果我不应该使用字典来执行此操作,请告诉我。该词典由两个列表组成。
答案 0 :(得分:2)
将内部for
循环更改为:
for key, vals in temp_dict.items():
if re.search('|'.join(vals)):
#do stuff here
至于首先使用字典,这完全取决于您是否需要通过键组织的值,如上所述。如果您只是想检查给定行中是否存在任何值,那么将'|'.join()
所有值放在一起可能会更好,并将结果字符串用作搜索表达式。
答案 1 :(得分:2)
虽然您可以牺牲性能的可读性, 尝试使用一个正则表达而不是三个。所以,例如:
if re.match('[RC].*(?:%s)' % '|'.join(map(re.escape, val), line):
print "value found!"
如果'R'或'C'不是您要匹配的val
项目的一部分,那么会在一步中执行您所描述的操作。如果是,您可以使用lookahead:
if re.match('(?=.*%s)[RC]' % '|'.join(map(re.escape, val), line):
print "value found!"
temp_dict = temp
不会执行任何操作
某地后到temp
;它只是给temp
一个新的内容
名称。您也可以考虑为变量提供比temp
和val
更有意义的名称。
虽然re
模块中内置了正则表达式缓存,
你应养成编译正则表达式的习惯
将反复使用,因为它会给你实质性的表现
好处。
这是我的风格,对你来说可能过于冗长:
RE_BEGINS_WITH_R_OR_C = re.compile('^[RC]')
当然,如果你每次循环都使用一个新的正则表达式,那么这样做是没有意义的......但如果你在上面的代码中,如果你只关心那个 项匹配,而不是哪个项匹配,那么您可以使用this answer展平列表列表(嵌套列表理解语法令人困惑,我不会争论:-),编译一个单个正则表达式,只需对文件的每一行使用 。
请注意the difference between re.match
and re.search
。当您可以使用re.search
时,无需锚定re.match
。
一般情况下,请阅读文档!不算太差!你可以先看一下你正在使用的Python(字符串,列表,字典和正则表达式)。