运行多个正则表达式一次

时间:2013-02-24 20:22:19

标签: python regex

我有一个非常长的文件,我设法使用Python正则表达式一次解析一个值,例如,这是我用来打印<h2>标签之间的所有值的代码:

import os
import re

def query():
    f = open('company.txt', 'r')    
    names = re.findall(r'<h2>(.*?)</h2>', f.read(), re.DOTALL)
    for name in names:
        print name

if __name__=="__main__":
    query()

我也重复同样的事情来打印area_code。但这次,我只是替换findall函数中的 pattern 来打印区号。这意味着我必须运行两次代码。

我的问题是,有没有办法简单地同时运行两个查询并将结果打印在由管道(|)分隔的一行中? 像这样:Planner | B21

下面是我试图解析的简短示例文件。

    <h2>Planner</h2>
    area_place = 'City of Angels';
    area_code = 'B21';
    period = 'Summer';
    ... more content
   <h2>Executive</h2>

    area_place = 'London';
    area_code = 'D33';
    period = 'Winter';
    ...more content

1 个答案:

答案 0 :(得分:0)

这对我的Python 2.7测试数据很有帮助,试试看:

import os
import re

def query():
    f = open('company.txt', 'r')    
    names = re.findall(r"<h2>(.+?)</h2>.*?area_code = '(.+?)'", f.read(), re.DOTALL)
    for name in names:
        print name[0] + " | " + name[1]

if __name__=="__main__":
    query()

基本上,我只是将两个查询合并为一个,然后以数字方式指定捕获组。您可能想要重命名“名称”,因为它的方式不太重要。

或者,如果您想保留现有的查询,并且可以假设它们的长度相同,那么您可以执行以下操作:

names = re.findall(your names regex)
area_codes = re.findall(your area code regex)

for i in range(len(names)):  //very dangerous, if there's one failed match many entries may be mismatched!
    print names[i] + " | " + area_codes[i]  

但是,除非您对数据的规律性非常有信心,否则我不会推荐这种方法。