我可以在一个Python正则表达式查询中使用多个搜索条件返回元组吗?
我有一个日志文件,程序在不同的日子运行时会不断添加新的日志。每次运行时,都会有一个新的产品版本和启动开关。我需要从每次运行中提取出 Product Version: [0-9-]*
和 Launch Switch: \w*
,并把它们放在一个元组里。
现在我这样做:
ver = re.findall(r'(?<=Product Version: )[0-9.]*', s)
launch = re.findall(r'(?<=Launch Switch: )\w*', s)
然后我会遍历 ver
和 launch
来创建这些元组。这样做是有效的,但看起来不太好,我相信有更符合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])
当然,这个方法有一些假设:
产品版本
和启动开关
总是按照这个顺序出现- 它们不能为空
- 每个字符串中只有一个这样的组合。
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')]
返回字符串中与模式匹配的所有不重叠的结果,结果会以字符串列表的形式给出。这个字符串是从左到右扫描的,匹配的结果会按照找到的顺序返回。如果模式中有一个或多个组,返回的将是一个组的列表;如果模式中有多个组,这个列表将会是一个元组的列表。空匹配也会包含在结果中,除非它们与另一个匹配的开始部分相接。