我是python和regex的新手。在这里,我试图在两个限制之间恢复文本。起始可以是mov / add / rd / sub /和/ etc ..并且结束限制是行的结尾。
/********** sample input text file *************/
f0004030: a0 10 20 02 mov %l0, %psr
//some unwanted lines
f0004034: 90 04 20 03 add %l0, 3, %o0
f0004038: 93 48 00 00 rd %psr, %o1
f000403c: a0 10 3f fe sub %o5, %l0, %g1
/*-------- Here is the code -----------/
try:
objdump = open(dest+name,"r")
except IOError:
print "Error: '" + name + "' not found in " + dest
sys.exit()
objdump_file = objdump.readlines()
for objdump_line in objdump_file:
a = ['add', 'mov','sub','rd', 'and']
if any(x in objdump_line for x in a) # To avoid unwanted lines
>>>>>>>>>> Here is the problem >>>>>>>>>>>>>
m = re.findall ('(add|mov|rd|sub|add)(.*?)($|\n)', objdump_line, re.DOTALL)
<<<<<<<<<<< Here is the problem <<<<<<<<<<<<<
print m
/*---------- Result I'm getting --------------*/
[('mov', ' %l0, %psr', '')]
[('add', ' %l0, 3, %o0', '')]
[('rd', ' %psr, %o1', '')]
[('sub', ' %o5, %l0, %g1', '')]
/*----------- Expected result ----------------*/
[' %l0, %psr']
[' %l0, 3, %o0']
[' %psr, %o1']
[' %o5, %l0, %g1']
我不知道为什么括号和不需要的引号会来!!提前谢谢。
答案 0 :(得分:1)
如果你在findall中使用分组,它将返回所有捕获的组,如果你想要一些特定的部分使用切片:
m = re.findall ('(add|mov|rd|sub|add)(.*?)($|\n)', objdump_line, re.DOTALL)[0][-2:-1]
此外,您可以在没有正则表达式的情况下解决问题,您已经检查字符串是否包含['add', 'mov','sub','rd', 'and']
中的任何一个,因此您可以拆分字符串并选择最后两个元素:
m = ' '.join(objdump_line.split()[-2:])
答案 1 :(得分:1)
引自here关于findall
返回字符串中所有非重叠的模式匹配,作为列表 字符串。从左到右扫描字符串,并返回匹配项 按顺序找到。如果模式中存在一个或多个组, 返回一个组列表;如果模式,这将是一个元组列表 有不止一个团体。结果中包含空匹配 除非他们触及另一场比赛的开始。
括号表示找到的一个组或列表,它包含另一个包含所有捕获组的列表。可以找到多个组。您可以将其作为
进行访问re.findall ('(add|mov|rd|sub|add)(.*?)($|\n)', objdump_line, re.DOTALL)[0][1]
0 represents the first group and 1 represents first element of the list of that group as you do not want any other element
捕获组尝试捕获括号之间匹配的表达式。但对于最后一个捕获组,没有文字。所以你得到一个空的''
正如您在评论中提到的那样使用此
add(.*?)$
而不是试试这个
(add)(.*?)$
()
表示捕获组,您将按预期获得结果