1

我需要解析这个输出:-

S1-link-id eNB-IP-Address MME-IP-Address Facing State
-------------------------------------------------- -----------------
303 141.1.1.2 191.1.1.2 eNodeB 已建立
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 成立
309 141.1.1.4 191.1.1.2 eNodeB 已建立
307 141.1.1.4 191.1.1.2 MME 成立

我想为单个 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*

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

4

2 回答 2

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', '已建立'), ('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', '已建立'),('309','141.1.1.4','191.1.1.2','eNodeB','已建立'),('307','141.1.1.4','191.1.1.2','MME ', '已确立的')]

于 2013-10-08T11:42:15.320 回答
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*[)]")
于 2013-10-08T12:51:03.537 回答