我需要解析这个输出: -
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*
在此之后坚持如何继续以获得整个输出的所需值。
答案 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*[)]")