使用正则表达式嵌入for循环

时间:2011-04-23 22:57:49

标签: python

def find_string(header,file_1,counter):
  ab = re.compile(str(header))
  for line in file_1:
    if re.search(ab,line) !=None:
       print line
  counter+=1
  return counter

file_1 = open("text_file_with_headers.txt",'r')
header_array = []
header_array.append("header1")
header_array.append("header2")
# ...

counter = 0
for header in header_array:
  counter = find_string(header,file_1,counter)

每次我运行它时,它只搜索其中一个标题,我无法弄清楚原因。

2 个答案:

答案 0 :(得分:3)

因为当第一个头的循环for line in file_1:结束时,文件的指针位于文件的末尾。您必须将此指针再次移动到文件的开头,这是通过函数 seek()完成的。您必须添加搜索(0,0),就像那样

counter = 0 
for header in header_array:
    counter = find_string(header,file_1,counter)
    f1.seek(0,0)

修改

1) ab 是一个已编译的正则表达式,然后你可以写ab.search(line)

2)bool(None) False ,然后您可以写if ab.search(line):不需要!= None

3)

def find_string(header,file_1,counter):
    lwh = re.compile('^.*?'+header+'.*$',re.MULTILINE)
    lines_with_header = lwh.findall(file-1.read())
    print ''.join(lines_with_header)
    return counter + 1

甚至

def find_string(header,file_1,counter):
    lwh = re.compile('^.*?'+header+'.*$',re.MULTILINE)
    print ''.join(matline.group() for matline in lwh.finditer(file-1.read()) )
    return counter + 1

4)

def find_string(header,file_1):
    lwh = re.compile('^.*?'+header+'.*$',re.MULTILINE)
    lines_with_header = lwh.findall(file-1.read())
    print ''.join(lines_with_header)

file_1 = open("text_file_with_headers.txt",'r')
header_list = ["header1","header2",....]

for counter,header in header_list:
    find_string(header,file_1)
    file_1.seek(0,0)

counter += 1 # because counter began at 0

5)你在header_list中有多个标题遍历file_1。

您应该只运行一次,并记录每个包含列表中的一个标题的行,该列是其键应为标题的字典值之一。它会更快。

6)Python中的数组是array

答案 1 :(得分:1)

文件对象跟踪你在文件中的位置,在你经历了一次外循环之后,你就在文件的末尾,没有更多的行可供阅读。

如果我是你,我会颠倒你的循环嵌套的顺序:我将逐行遍历文件,并为每一行迭代你想要找到的字符串列表。这样,我只需要从文件中读取一行。