Python正则表达式查找子字符串

时间:2016-02-06 06:36:54

标签: python regex python-2.7 python-2.x

我是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']

我不知道为什么括号和不需要的引号会来!!提前谢谢。

2 个答案:

答案 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

的python文档
  

返回字符串中所有非重叠的模式匹配,作为列表   字符串。从左到右扫描字符串,并返回匹配项   按顺序找到。如果模式中存在一个或多个组,   返回一个组列表;如果模式,这将是一个元组列表   有不止一个团体。结果中包含空匹配   除非他们触及另一场比赛的开始。

括号表示找到的一个组或列表,它包含另一个包含所有捕获组的列表。可以找到多个组。您可以将其作为

进行访问
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)(.*?)$

()表示捕获组,您将按预期获得结果