使用正则表达式从输出中解析所需的字段

时间:2013-10-08 11:40:21

标签: python

我需要解析这个输出: -

S1-link-id   eNB-IP-Address   MME-IP-Address    Facing  State
-------------------------------------------------------------------
303          141.1.1.2        191.1.1.2         eNodeB  Established
301          141.1.1.2        191.1.1.2         MME     Established
306          141.1.1.3        191.1.1.2         eNodeB  Established
304          141.1.1.3        191.1.1.2         MME     Established
309          141.1.1.4        191.1.1.2         eNodeB  Established
307          141.1.1.4        191.1.1.2         MME     Established

我想为单个id(第一列)获取多个值。 对于“303” - 我需要enb,mme ip地址,面向和状态值,对于其他ID也是如此。

一个所需输出的正则表达式: -

\s*(?P<id>\d+)\s+(?P<enb_adr>\d+\.\d+\.\d+\.\d+)\s+(?P<mme_adr>\d+\.\d+\.\d+\.\d+)\s+(?P<facing>\w+)\s+(?P<state>\w+)\s*

在此之后坚持如何继续以获得整个输出的所需值。

2 个答案:

答案 0 :(得分:5)

看起来你的正则表达式没问题,所以你需要做的就是使用re.findall()

import re
print re.findall(r'\s*(?P<id>\d+)\s+(?P<enb_adr>\d+\.\d+\.\d+\.\d+)\s+(?P<mme_adr>\d+\.\d+\.\d+\.\d+)\s+(?P<facing>\w+)\s+(?P<state>\w+)\s*', the_text_above)

返回:

  

[('303','141.1.1.2','191.1.1.2','eNodeB','Established'),('301','141.1.1.2','191.1.1.2','MME' ,'已建立'),('306','141.1.1.3','191.1.1.2','eNodeB','已建立'),('304','141.1.1.3','191.1.1.2',' MME','Established'),('309','141.1.1.4','191.1.1.2','eNodeB','Established'),('307','141.1.1.4','191.1.1.2' ,'MME','已建立')]

答案 1 :(得分:0)

尽管@Haidro已经回答了这个问题,但我想给你提供一个有用的建议,就像你在那里一样有很长的正则表达式。评论您的正则表达式细分!

我会是第一个承认,我在正则表达式上吮吸。我总是回到这样的例子,并感谢“过去我”,因为我很努力地使用文档。关键是使用flags=re.VERBOSE

_brokendown_for_joo = re.compile("""
        get
            (As                 #/1
                (Int            #/2
                |Float
                |Boolean
                |String
                |StringList
                |Char)
            |Required
            )?
        [(]                     #opening paren       
            ['\"]               #single or double quotes
                (\w+)           #Anyword   /3
            ['\"]               #single or double quotes
                ,\s*            #comma and optional spaces
            ['\"]               #single or double quotes
                (\w+)           #Anyword  /4
            ['\"]               #single or double quotes
                (,\s*           #comma and optional spaces  /5
                (\w+            #anyword  /6
                |['][^']+[']    #or any chars in single quotes
                |[\"][^\"]+[\"] #or any chars in double quotes
                ))?
            \s*                 #optional spaces
        [)]                     #closing paren
        """, flags=re.VERBOSE)

比这更容易阅读。

re.compile(r"(%s)[.]get(As(Int|Float|Boolean|String|StringList|Char)|Required)?[(]['\"](\w+)['\"],\s*['\"](\w+)['\"](,\s*(\w+|['][^']+[']|[\"][^\"]+[\"]))?\s*[)]")