我可以在一个python正则表达式查询中使用多个搜索条件来返回元组吗?

时间:2013-02-07 17:14:21

标签: python regex tuples

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

目前我这样做:

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

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

然后我在迭代verlaunch来创建元组。它有效,但它并不漂亮,我确信有更多的Pythonic方法。

3 个答案:

答案 0 :(得分: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')]

来自the re.findall docs

  

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

答案 1 :(得分:2)

您可以使用zip

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

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

答案 2 :(得分: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 VersionLaunch Swtich始终按此顺序
  2. 不是空的
  3. 每个字符串中只有一个。