gpt4 book ai didi

python-3.x - 匹配两个lookbehinds之一

转载 作者:行者123 更新时间:2023-12-04 00:12:52 25 4
gpt4 key购买 nike

我试图通过从日志文件中提取设备的 id 来填充 Pandas.DataFrame 中的列。问题是 id 前面可能有两个单独的模式,如下所示:

模式 1:

(?<=cameraId=\')([a-z0-9-]+))

模式 2:

(?<=/live/)([a-z0-9-]+)

注意:一条线不可能同时拥有两种模式

问题是我使用 Pandas.String.str.findall() 方法,并且我希望填充两种模式。

我可以成功实现如下代码所示的预期结果:

import pandas as pd

line_1 = 'INFO:2021-04-19 00:25:10,647:instance_manager.py:MainProcess:1:got event notificationName=\'DETECTION_STARTED\' cameraId=\'ab1c-ab6c-a6f6-a6d6-ab666\' timestamp=\'2021-04-19T00:24:08.192169Z\''

line_2 = 'INFO:2021-04-19 00:25:11,278:instance_manager.py:MainProcess:1:An old record record for the stream rtsp://127.0.1.1:6666/live/a001-a00a-0016-a006-ab606.stream was successfully updated in the DB!'

df = pd.DataFrame(columns=['type', 'ts', 'process', 'subprocess', 'line', 'message'])

line_1_parsed = pd.Series([line_1]).str.extract(r'(?P<type>[^:]+):(?P<ts>.+,\d+):(?P<process>[^:]+):(?P<subprocess>[^:]+):(?P<line>[^:]+):(?P<message>[^$]+)')
line_2_parsed = pd.Series([line_2]).str.extract(r'(?P<type>[^:]+):(?P<ts>.+,\d+):(?P<process>[^:]+):(?P<subprocess>[^:]+):(?P<line>[^:]+):(?P<message>[^$]+)')

df =df.append(line_1_parsed, ignore_index=True)
df =df.append(line_2_parsed, ignore_index=True)

df.loc[:, 'cam_id'] = df.loc[:, 'message'].str.findall('(?<=cameraId=\')([a-z0-9-]+)|(?<=/live/)([a-z0-9-]+)')
df

,但它们以元组(模式 1,模式 2)的形式返回,如 Current Output 所示:

电流输出:

    type    ts  process     subprocess  line    message     cam_id
0 INFO 2021-04-19 00:25:10,647 instance_manager.py MainProcess 1 got event notificationName='DETECTION_STARTED'... [(ab1c-ab6c-a6f6-a6d6-ab666, )]
1 INFO 2021-04-19 00:25:11,278 instance_manager.py MainProcess 1 An old record record for the stream rtsp://127... [(, a001-a00a-0016-a006-ab606)]

我明白这是因为它尝试两种模式并返回两者的匹配项,但我希望它只包含成功的模式。

当然,我可以通过以下方式手动提取它:

df.loc[:, 'cam_id'] = df.loc[:, 'cam_id'].apply(lambda cam_id_tuple: cam_id_tuple[0][0] if cam_id_tuple[0][0] != '' else cam_id_tuple[0][1])
df

但这是一个相当麻烦的解决方案,而且不可扩展,以防我想添加模式。

所需的输出:

    type    ts  process     subprocess  line    message     cam_id
0 INFO 2021-04-19 00:25:10,647 instance_manager.py MainProcess 1 got event notificationName='DETECTION_STARTED'... [ab1c-ab6c-a6f6-a6d6-ab666]
1 INFO 2021-04-19 00:25:11,278 instance_manager.py MainProcess 1 An old record record for the stream rtsp://127... [a001-a00a-0016-a006-ab606]`

注意: cam_id 列包含字符串而不是元组

提前致谢。

最佳答案

我们可以使用 str.extract使用具有单个捕获组的正则表达式模式

df['message'].str.extract(r'(?:cameraId=\'|/live/)([a-z0-9-]+)', expand=False)

0    ab1c-ab6c-a6f6-a6d6-ab666
1 a001-a00a-0016-a006-ab606
Name: message, dtype: object

正则表达式详细信息:

  • (?:cameraId=\'|/live/):非捕获组
    • cameraId=\' :第一个替代匹配字符 cameraId=' 字面意思
    • /live/ :第二个选择匹配字符 /live/ 字面意思
  • ([a-z0-9-]+) : 第一个捕获组
    • [a-z0-9-]+ :匹配列表中存在的任何字符 [a-z0-9-] 一次或多次

在线查看regex demo

关于python-3.x - 匹配两个lookbehinds之一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67197060/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com