3

我有一个日志文件,当程序在不同的日子运行时,它会附加新的日志。每次迭代都会有一个新的产品版本和启动开关。我需要每次迭代中的Product Version: [0-9-]*and作为一个元组。Launch Switch: \w*

目前我正在这样做:

ver = re.findall(r'(?<=Product Version: )[0-9.]*', s)

launch = re.findall(r'(?<=Launch Switch: )\w*', s)

然后稍后我将遍历verlaunch创建元组。它有效,但它并不漂亮,我确信有一种更 Pythonic 的方式来做到这一点。

4

3 回答 3

3

您可以在正则表达式模式中使用多个捕获组;re.findall然后将它们作为元组返回。例如:

>>> data = "Product Version: 0.0.1 | Launch Switch: hello | Product Version: 2.3.4 | Launch Switch: world"
>>> re.findall("Product Version: ([0-9.]+).*?Launch Switch: (\w+)", data)
[('0.0.1', 'hello'), ('2.3.4', 'world')]

文档_re.findall

返回字符串中模式的所有非重叠匹配,作为字符串列表。从左到右扫描字符串,并按找到的顺序返回匹配项。如果模式中存在一个或多个组,则返回组列表;如果模式有多个组,这将是一个元组列表。空匹配包含在结果中,除非它们触及另一个匹配的开始。

于 2013-02-07T17:32:47.880 回答
2

你可以使用zip

ver_launch_tuples = zip(re.findall(r'(?<=Product Version: )[0-9.]*', s),
                        re.findall(r'(?<=Launch Switch: )\w*', s))

这将创建一个 (ver,launch) 元组列表。

于 2013-02-07T17:24:15.597 回答
0

我不确定这是多么“pythonic”,但它会从包含这些项目的字符串中获取您的元组:

import re
str = """Product Version: 23423
Launch Switch: foiwjefj"""
tuple([word for sublist in [[x for x in f if x != ''] for f in re.findall(
    r'Product Version: (\d+)|Launch Switch: (\w+)', str)] for word in sublist])

这当然做了一些假设:

  1. Product Version并且Launch Swtich总是按那个顺序来
  2. 不为空
  3. 每个字符串只有一个。
于 2013-02-07T17:58:11.760 回答