正则表达式:字符串的开头不按预期运行

时间:2017-10-18 16:12:19

标签: python regex

我正在解析(通过正则表达式)由ARM链接器生成的.map文件。我已经提取了很多东西,但这部分是抵制的。

以下是我要解析的部分的摘录

^ COMMON\s+(0x\S+)\s+(0x\S+).*(?:\s+(0x\S+)\s+(\S+)[\r\n])*(?:\s+\*fill\*\s+0x\S+\s+(0x\S+))?

这是我最好的正则表达式尝试:

COMMON

可以检查结果here。我得到的结果只匹配块的最后一行(我认为它是以[{ '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` 开头的块)分成两部分。第1组:

        0x20002b19                GLB_appIntObjPropChangeFlags
        0x20002b1a                GLB_aioBLCommand
        0x20002b65                GLB_aioDateTime

和Group2:

^ COMMON\s+(0x\S+)\s+(\S+)\s+(\S+)

然后,我可以分别对每个组进行正则表达式:

第1组的正则表达式:

^\s+(0x\S+)\s+(\S+)

和另一组2(设置多行标志):

dict

因此,我将从第一个正则表达式获得三个组,其他六个组(每3行每个线数2个)可以轻松转换为<md-icon class="material-icons md-72" ng-click="showAdvanced($event)" role="button">assignment</md-icon> 的列表,如上所示。

1 个答案:

答案 0 :(得分:2)

实际上,您应该Wiktor Stribiżew抓住问题评论中提到的每个COMMON块。链接到Wiktor的正则表达式here。正则表达式没有能力遍历子查询(这不是它的目的)。

不切实际,您可以使用此正则表达式来抓取每个COMMON部分及其后续块,然后映射它。

代码

See regex in use here

(?:COMMON\s+0x[0-9a-f]+\s+(0x[0-9a-f]+)\s+(\S+)|\s*(0x[0-9a-f]+)\s+(\S+))(?=\s*[\r\n])

说明

  • 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_Programa/source/board.o
    • 第3组0x20002b18
    • 第4组BOARD_ctx
  • 第二集
    • 第1组 0x87
    • 第2组 ./2_Programa/source/interface_objects.o
    • 第3组0x20002b19
    • 第4组GLB_appIntObjPropChangeFlags
    • 第3组0x20002b1a
    • 第4组GLB_aioBLCommand
    • 第3组0x20002b65
    • 第4组GLB_aioDateTime

始终将第1组和第2组的最后一场比赛与第3组和第4组的当前比赛相关联