python:regex catch变量组数

2024-10-05 21:57:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一根线看起来像:

TABLE_ENTRY.0[hex_number]= <FIELD_1=hex_number, FIELD_2=hex_number..FIELD_X=hex>
TABLE_ENTRY.1[hex_number]= <FIELD_1=hex_number, FIELD_2=hex_number..FIELD_Y=hex>

字段的数量未知,并且随着条目的不同而变化,我想捕获 每个条目分别包含其所有字段及其值。在

我想到了:

^{pr2}$

它与表条目和第一个字段相匹配,但我不知道如何计算可变字段数。在

输入:

ENTRY_0[0x130]=0: <FIELD_0=0, FIELD_1=0x140... FIELD_2=0xff3>

输出应为:

ENTRY 0:
        FIELD_0=0
        FIELD_1=0x140
        FIELD_2=ff3
ENTRY 1:
        ...

Tags: 目的numberfield数量table条目entryhex
2条回答

使用捕获组匹配不合适的长度:

([A-Z_0-9\.]+\[0x[0-9]+\]=)\s+<(([A-Z_0-9]+)=(0x[0-9]+|0),\s?)*([A-Z_0-9]+)=(0x[0-9]+|0)

下面的部分用逗号和空格匹配每个字段

^{pr2}$

并且([A-Z_0-9]+)=(0x[0-9]+|0)将匹配最新字段。在

演示:https://regex101.com/r/gP3oO6/1

注意:如果您不想让某些组使用非捕获组,最好在捕获组的前面添加?:。((?: ...)),并注意{}作为regex中的额外值(基于您的输入模式)

简而言之,在re引擎中不可能完成所有这些。无法动态生成更多组。它会把它放在一个组里。您应该像这样重新分析结果:

import re
input_str = ("TABLE_ENTRY.0[0x1234]= <FIELD_1=0x1234, FIELD_2=0x1234, FIELD_3=0x1234>\n"
             "TABLE_ENTRY.1[0x1235]= <FIELD_1=0x1235, FIELD_2=0x1235, FIELD_3=0x1235>")
results = {}
for match in re.finditer(r"([A-Z_0-9\.]+\[0x[0-9A-F]+\])=\s+<([^>]*)>", input_str):
    fields = match.group(2).split(", ")
    results[match.group(1)] = dict(f.split("=") for f in fields)

>>> results
{'TABLE_ENTRY.0[0x1234]': {'FIELD_2': '0x1234', 'FIELD_1': '0x1234', 'FIELD_3': '0x1234'}, 'TABLE_ENTRY.1[0x1235]': {'FIELD_2': '0x1235', 'FIELD_1': '0x1235', 'FIELD_3': '0x1235'}}

输出只是一个大dict,由一个表条目组成,到它的字段的dict。在

它也相当方便,因为你可以这样做:

^{pr2}$

我个人建议去掉“TABLE_ENTRY”,因为它是重复的,但如你所愿。在

相关问题 更多 >