我正在尝试编写一个脚本来解析由编译器/链接器生成的映射文件,如下所示:
%SEGMENT_SECTION
Start Address End Address
--------------------------------------------------------------------------------
Segment Name: S1_1, Segment Type: .bss 0A000000 0A050F23
--------------------------------------------------------------------------------
area1_start.o (.bss) 0A000000 0A000003
...
Start Address End Address
--------------------------------------------------------------------------------
Segment Name: S2_1, Segment Type: .bss 0A050F24 0A060000
--------------------------------------------------------------------------------
area2_start.o (.bss) 0A000000 0A000003
...
%NEXT_SECTION
我目前正在编写几个正则表达式(python的re模块)来解析它,但我想以一种非常容易阅读的方式编写它们,这样解析起来非常简单。基本上:
with open('blah.map') as f:
text = f.read()
# ... Parse the file to update text to be after the %SEGMENT_SECTION
match = segment_header_re.match(text)
seg_name, seg_type, start_addr, end_addr = match.groups()
# ... (Do more with matched values)
text = text[len(match.matched_str):]
# Parse the remainder of text
但是,我不知道如何获取匹配字符串的长度,就像我的match.matched_str
伪代码一样。我在python的re文档中没有看到任何内容。有没有更好的方法来进行这种类型的解析?
答案 0 :(得分:3)
对于您要实现的目标,请使用match.span
方法。
>>>
>>> s = 'The quick brown fox jumps over the lazy dog'
>>> m = re.search('brown', s)
>>> m.span()
(10, 15)
>>> start, end = m.span()
>>> s[end:]
' fox jumps over the lazy dog'
>>>
或只是match.end
方法。
>>> s[m.end():]
' fox jumps over the lazy dog'
>>>
另一种选择是使用regular expression objects,可以使用pos
和endpos
参数将搜索限制为字符串的一部分。
>>> s = 'The quick brown fox jumps over the lazy dog'
>>> over = re.compile('over')
>>> brown = re.compile('brown')
>>> m_brown = brown.search(s)
>>> m_brown.span()
(10, 15)
>>> m_over = over.search(s)
>>> m_over.span()
(26, 30)
在over
的匹配结束时开始搜索brown
。
>>> match = over.search(s, pos = m_brown.end())
>>> match.group()
'over'
>>> match.span()
(26, 30)
从brown
的匹配结束处开始搜索over
,不会产生匹配。
>>> match = brown.search(s, m_over.end())
>>> match.group()
Traceback (most recent call last):
File "<pyshell#71>", line 1, in <module>
match.group()
AttributeError: 'NoneType' object has no attribute 'group'
>>> print(match)
None
>>>
对于长字符串和多次搜索,使用带有起始位置参数的正则表达式对象肯定会加快速度。
答案 1 :(得分:1)
您可以使用.group()
方法。 match.group(0)
可以检索整个匹配的字符串:
text = text[len(match.group(0)):]
演示:
>>> import re
>>> re.match('(a)bc(d)', 'abcde').group(0) # 'e' is excluded since it wasn't matched
'abcd'
>>>
>>> # You can also get individual capture groups by number (starting at 1)
>>> re.match('(a)bc(d)', 'abcde').group(1)
'a'
>>> re.match('(a)bc(d)', 'abcde').group(2)
'd'
>>>
但请注意,如果没有匹配,则会引发AttributeError
:
>>> re.match('xyz', 'abcde').group(0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'
>>>
您可能希望在调用匹配对象上的方法之前执行检查以确保匹配成功。