使用python中的regex从文本文件中提取每个包提供的内容



我已经有一段时间没有处理这个问题了,但我不知道如何解决我的问题。

我在这个链接中有多个段落,例如Packages.gz文件中的段落http://fr.archive.ubuntu.com/ubuntu/dists/trusty-security/main/binary-amd64/

我希望你能帮助我使用正则表达式来处理它,以便在最后得到一个字典,其中包含作为关键字的包和值,以及它们提供的包的列表。

正如您所看到的,有些包确实提供了一个或多个包,而其他包则没有。我最好的正则表达式如下:

    ((?<=Package: ).*)|((?<=Provides: )(?:[, ]*[a-zA-Z0-9-+.]*))

它停在"提供:"句子中的第一个包上,但我需要它们都不带","。

感谢您的帮助。非常感谢。

您不需要在这里重新发明轮子。python apt库已经实现了您想要的文本文件解析。我建议使用它。它会给你一个包的提供列表。

这里有一个程序,它构建一个dict对象,将"package"行映射到代表"provides"行的list

它根据请求使用正则表达式和re.findall

import re
from pprint import pprint
with open('Packages') as fp:
    data = fp.read()
data = re.findall(
    r'''
    (?smx)                  # Dot matches all, Multiline, Verbose
    ^Package:s*(.*?)$      # The package line
    .*?                 #     Arbitrary lines
    (?:
        ^Provides:s*(.*?$) # The provides line
        |                   # OR
        ^$                  #  an empty line
    )
    ''',
    data)
data = {k:v.split(',') if v else [] for k,v in data}
pprint(data)

或者,这里有一个不使用正则表达式的解决方案。它在我的电脑上运行得稍微快一点,在你的70000行文件上。然而,速度差异在很大程度上无关紧要;差异小于0.02秒。

import re
from pprint import pprint
def gen():
    with open('Packages') as fp:
        for line in fp:
            if line.startswith('Package:'):
                package = line.split(':')[1].strip()
            elif line.startswith('Provides:'):
                yield package, line.split(':')[1].strip().split(',')
                package = None
            elif package and line == 'n':
                yield package, []
                package = None
        if package:
            yield package, []
data = dict(gen())
pprint(data)

最新更新