我已经有一段时间没有处理这个问题了,但我不知道如何解决我的问题。
我在这个链接中有多个段落,例如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)