如何在使用正则表达式搜索时排除注释行?

时间:2010-11-22 17:01:56

标签: python string

当以#和任意数量的空格开头时,需要排除使用正则表达式定位的块。这是一个示例文件

&START   A=23  ... more data ...
                  B=24    &END
#   &START   A=34  ... more data ...
                  B=24    &END
&START   .... block 3 of data across multiple lines ....  &END
&START   .... block 4 of data across multiple lines ....  &END

以下正则表达式不会像我预期的那样排除注释条目 -

(?!#\s*)&START(.+?)&END 

希望遍历条目和文件以进行处理。用于执行此操作的Python代码(除了通过注释行之外,它的效果很好) -

f=open(filename)
data=f.read()
f.close()

pattern=re.compiler(r'(?!#\s*)&START(.+?)&END, re.DOTALL)
get_entries = pattern.findall

for entry in get_entries(data):
    # process the entry
    print entry

在正则表达式方面,我可能是一个基本的疏忽,因为我是绿色的。非常感谢能够提出建议的任何人。

3 个答案:

答案 0 :(得分:5)

完全删除该行。

if line.lstrip().startswith('#'):
  continue

答案 1 :(得分:2)

这似乎有效:

import re

target="""
&START   A=23  ... more data ...
                  B=24    &END
#   &START   A=C34  ... more data ...
                  B=C24    &END
&START   .... block 3 of data across multiple lines ....  &END
&START   .... block 4 of data across multiple lines ....  &END
"""

regex = re.compile("^(?!#)&START (.*?)&END",re.MULTILINE|re.DOTALL)

for s in regex.findall(target):
   print s

返回:

  A=23  ... more data ...
                  B=24    
  .... block 3 of data across multiple lines ....  
  .... block 4 of data across multiple lines ....  

答案 2 :(得分:0)

这最好用于发电机。 使用(m)多行标记将允许它搜索下一行,直到找到结束标记。