Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 正则表达式:字符串开头的行为不符合预期_Python_Regex - Fatal编程技术网

Python 正则表达式:字符串开头的行为不符合预期

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

我正在解析(通过正则表达式)由ARM的链接器生成的.map文件。我已经提取了几乎所有的内容,但这一部分是抵制的

下面是我要分析的部分的摘录

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])