在上运行多个Regex

2024-05-13 12:53:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个很长的文件,我用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

Tags: 文件代码nameimportrenamescodeplace
1条回答
网友
1楼 · 发布于 2024-05-13 12:53:34

这在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]  

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

相关问题 更多 >