Python 正则表达式:字符串开头的行为不符合预期
我正在解析(通过正则表达式)由ARM的链接器生成的.map文件。我已经提取了几乎所有的内容,但这一部分是抵制的 下面是我要分析的部分的摘录Python 正则表达式:字符串开头的行为不符合预期,python,regex,Python,Regex,我正在解析(通过正则表达式)由ARM的链接器生成的.map文件。我已经提取了几乎所有的内容,但这一部分是抵制的 下面是我要分析的部分的摘录 COMMON 0x20002b18 0x1 ./2_Programa/source/board.o 0x20002b18 BOARD_ctx COMMON 0x20002b19 0x87 ./2_Programa/source/interfa
COMMON 0x20002b18 0x1 ./2_Programa/source/board.o
0x20002b18 BOARD_ctx
COMMON 0x20002b19 0x87 ./2_Programa/source/interface_objects.o
0x20002b19 GLB_appIntObjPropChangeFlags
0x20002b1a GLB_aioBLCommand
0x20002b65 GLB_aioDateTime
COMMON 0x20002ba0 0x31 ./2_Programa/source/objects.o
0x20002ba0 GLB_goFlags
*fill* 0x20002bd1 0x3
这是我最好的正则表达式尝试:
^ COMMON\s+(0x\S+)\s+(0x\S+).*(?:\s+(0x\S+)\s+(\S+)[\r\n])*(?:\s+\*fill\*\s+0x\S+\s+(0x\S+))?
结果是可以检查的。我得到的结果,只匹配块的最后一行(我考虑一个块,当它开始<代码>通用< /代码>)时,
我需要提取的内容与此类似:
[{
'name': 'GLB_appIntObjPropChangeFlags',
'size': 0x01,
'path': './2_Programa/source/interface_objects.o',
'origin': 0x20002b19
},
{
'name': 'GLB_aioBLCommand',
'size': 0x87,
'path': './2_Programa/source/interface_objects.o',
'origin': 0x20002b1a
},
...
]
我这里的主要问题是我不能分开第一行
COMMON 0x20002b19 0x87 ./2_Programa/source/interface_objects.o`
从与之相关的其他人那里
0x20002b19 GLB_appIntObjPropChangeFlags
0x20002b1a GLB_aioBLCommand
0x20002b65 GLB_aioDateTime
谁能给我一些提示来面对这件事
更新
我想做的是将所有块(以COMMON
开头的块)分成两部分。第一组:
COMMON 0x20002b19 0x87 ./2_Programa/source/interface_objects.o`
第二组:
0x20002b19 GLB_appIntObjPropChangeFlags
0x20002b1a GLB_aioBLCommand
0x20002b65 GLB_aioDateTime
然后,我可以分别对每组进行正则表达式:
第1组的正则表达式:
^ COMMON\s+(0x\S+)\s+(\S+)\s+(\S+)
另一个用于组2(设置多行标志):
因此,我将从第一个正则表达式中得到三组,另外六组(每3行2行)可以很容易地转换为dict
s列表,如我上面所示。Brief
实际上,您应该抓住问题下方注释中提到的每个公共块。链接到Wiktor的正则表达式。正则表达式不能循环子查询(这不是它的目的)
不切实际的是,您可以使用此正则表达式获取每个公共部分及其后续块,然后映射它
代码
解释
COMMON\s+0x[0-9a-f]+\s+(0x[0-9a-f]+)\s+(\s+)
选项1
COMMON\s+0x[0-9a-f]+\s+
COMMON
字符COMMON
字面意思
\s+
一个或多个空白字符
0x
这些字符0x
按字面意思
[0-9a-f]+
集合中的一个或多个字符0-9a-f
\s+
一个或多个空白字符\s+
(0x[0-9a-f]+)
将以下内容捕获到捕获组1中
0x
这些字符0x
按字面意思
[0-9a-f]+
集合中的一个或多个字符0-9a-f
\s+
一个或多个空白字符
(\S+)
将一个或多个非空白字符捕获到捕获组2中
\s*(0x[0-9a-f]+)\s+(\s+)
选项2
\s*
任意数量的空白字符
(0x[0-9a-f]+)
将以下内容捕获到捕获组3中
0x
这些字符0x
按字面意思
[0-9a-f]+
集合中的一个或多个字符0-9a-f
\s+
一个或多个空白字符
(\S+)
将一个或多个非空白字符捕获到捕获组4中
(?=\s*[\r\n])
确保后面是任意数量的空白字符,后跟换行符\r\n
用法
根据匹配项的顺序和它们所属的组,您可以将它们映射到所呈现的数组
例如(按匹配顺序)
- 第一盘
- 组1
0x1
- 第2组
/2\u程序a/source/board.o
- 第3组
0x20002b18
- 第4组
BOARD\u ctx
- 第二盘
- 第1组
0x87
- 组2
/2\u程序a/source/interface\u对象。o
- 第3组
0x20002b19
- 第4组
GLB_AppInObjPropChangeFlags
- 第3组
0x20002b1a
- 第4组
GLB\u aioBLCommand
- 第3组
0x20002b65
- 第4组
GLB_aioDateTime
- 等等
始终将组1和组2的最后一个匹配项与组3和组4的当前匹配项相关联
实际上,您应该抓住问题下方注释中提到的每个公共块。链接到Wiktor的正则表达式。正则表达式不能循环子查询(这不是它的目的)
不切实际的是,您可以使用此正则表达式获取每个公共部分及其后续块,然后映射它
代码
解释
COMMON\s+0x[0-9a-f]+\s+(0x[0-9a-f]+)\s+(\s+)
选项1
COMMON\s+0x[0-9a-f]+\s+
COMMON
字符COMMON
字面意思
\s+
一个或多个空白字符
0x
这些字符0x
按字面意思
[0-9a-f]+
集合中的一个或多个字符0-9a-f
\s+
一个或多个空白字符\s+
(0x[0-9a-f]+)
将以下内容捕获到捕获组1中
0x
这些字符0x
按字面意思
[0-9a-f]+
集合中的一个或多个字符0-9a-f
\s+
一个或多个空白字符
(\S+)
将一个或多个非空白字符捕获到捕获组2中
\s*(0x[0-9a-f]+)\s+(\s+)
选项2
\s*
任意数量的空白字符
(0x[0-9a-f]+)
将以下内容捕获到捕获组3中
0x
这些字符0x
按字面意思
[0-9a-f]+
集合中的一个或多个字符0-9a-f
\s+
一个或多个空白字符
(\S+)
将一个或多个非空白字符捕获到ca中
^\s+(0x\S+)\s+(\S+)
(?:COMMON\s+0x[0-9a-f]+\s+(0x[0-9a-f]+)\s+(\S+)|\s*(0x[0-9a-f]+)\s+(\S+))(?=\s*[\r\n])