1

我有一个很长的文件,我设法一次使用 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 函数中的模式来打印区号。这意味着我必须运行代码两次。

我的问题是,有没有一种方法可以简单地同时运行两个查询并将结果打印在由管道 (|) 分隔的一行中?像这样: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
4

1 回答 1

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]  

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

于 2013-02-24T20:33:07.550 回答