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

3 投票
3 回答
2204 浏览
提问于 2025-04-17 15:08

我有一个日志文件,程序在不同的日子运行时会不断添加新的日志。每次运行时,都会有一个新的产品版本和启动开关。我需要从每次运行中提取出 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 来创建这些元组。这样做是有效的,但看起来不太好,我相信有更符合Python风格的方法。

3 个回答

0

我不太确定这个方法有多“python风格”,但它可以从一个字符串中提取出元组,字符串里的这些项目可以是任意顺序:

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. 产品版本启动开关总是按照这个顺序出现
  2. 它们不能为空
  3. 每个字符串中只有一个这样的组合。
2

你可以使用 zip 这个方法:

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

这样做会生成一个包含 (版本, 启动) 的列表,每一对数据叫做一个元组。

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 的文档

返回字符串中与模式匹配的所有不重叠的结果,结果会以字符串列表的形式给出。这个字符串是从左到右扫描的,匹配的结果会按照找到的顺序返回。如果模式中有一个或多个组,返回的将是一个组的列表;如果模式中有多个组,这个列表将会是一个元组的列表。空匹配也会包含在结果中,除非它们与另一个匹配的开始部分相接。

撰写回答