我有一个日志文件,在程序在不同的日子运行时附加新日志。每次迭代都会有一个新的产品版本和启动开关。我需要每次迭代中的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
来创建元组。它有效,但它并不漂亮,我确信有更多的Pythonic方法。
答案 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')]
返回字符串中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])
这当然会做出一些假设:
Product Version
和Launch Swtich
始终按此顺序