1

我正在 for 循环中创建一个 for 循环。我正在遍历一个列表并找到一个包含正则表达式模式的特定字符串。找到该行后,我需要搜索以找到某个模式的下一行。我需要存储这两行才能解析出它们的时间。我创建了一个计数器来跟踪列表的索引号,因为外部 for 循环工作。我可以使用这样的结构来找到我需要的第二行吗?

 index = 0
 for lineString in summaryList:  
    match10secExp = re.search('taking 10 sec. exposure', lineString)
    if match10secExp:
       startPlate = lineString
       for line in summaryList[index:index+10]:
           matchExposure = re.search('taking \d\d\d sec. exposure', line)
           if matchExposure:
               endPlate = line
           break
    index = index + 1

代码运行,但我没有得到我正在寻找的结果。

谢谢。

4

2 回答 2

1
matchExposure = re.search('taking \d\d\d sec. exposure', lineString)

应该是

matchExposure = re.search('taking \d\d\d sec. exposure', line)
于 2010-06-23T21:00:14.650 回答
1

根据您的确切需求,您可以只使用列表中的迭代器,或者其中两个作为itertools.tee的 mae 。即,如果您只想在第一个模式之后搜索第二个模式的行则可以使用单个迭代器:

theiter = iter(thelist)

for aline in theiter:
  if re.search(somestart, aline):
    for another in theiter:
      if re.search(someend, another):
        yield aline, another  # or print, whatever
        break

不会搜索从aline到结尾的行anotherfor somestartfor someend。如果您需要为这两个目的搜索它们,即,theiter为外部循环保持其自身完整,那么tee可以提供帮助:

for aline in theiter:
  if re.search(somestart, aline):
    _, anotheriter = itertools.tee(iter(thelist))
    for another in anotheriter:
      if re.search(someend, another):
        yield aline, another  # or print, whatever
        break

tee这是文档给出的一般规则的一个例外:

一旦tee()进行了拆分,原始的可迭代对象就不应在其他任何地方使用;否则,在不通知 tee 对象的情况下,iterable 可能会被推进。

因为 和 的推进theiter发生anotheriter在代码的不相交部分,并且anotheriter总是在需要时重新构建(因此同时推进theiter不相关)。

于 2010-06-23T21:00:43.300 回答