2015-05-04 101 views
1

解析我有列表這樣得到的字符串在Python列表

["<name:john student male age=23 subject=\computer\sience_{20092973}>", 
"<name:Ahn professor female age=61 subject=\computer\math_{20092931}>"] 

我想用{} 20092973拿到學生,{20092931}。

,所以我想拆列出這樣

我期望的結果1是本(輸入{20092973})

"student" 

我期待的結果2是這個(輸入{20092931})

"professor" 

我已經在搜索...但我找不到..抱歉..

我怎麼能THI S'

+0

你從哪裏得到這個列表?格式大概是在某個地方定義的;如果可以的話,最好使用它,而不是猜測它。 – abarnert

+0

我在scapy中得到這個列表。我讓函數修改scapy。 – Somputer

+0

origin list is [''] – Somputer

回答

5

我不認爲你應該在第一時間做這個。不像你的玩具的例子,你的真正的問題不涉及一些笨拙的格式的字符串;它涉及Scapy NetworkInterface對象。哪些屬性可以直接訪問。你只需要解析它,因爲你存儲了它的字符串表示。只是不要那樣做;存儲您實際需要的屬性時,您將它們作爲屬性。

NetworkInterface對象不是文檔中描述的(因爲它是Windows的特定代碼的實現細節),但你可以交互地檢查它像Python中的任何其他類別(例如,dir(ni)會顯示所有屬性),或者只是看看the source。你想要的值是namewin_name。所以,而不是print ni,只是做一些像print '%s,%s' % (ni.name, ni.win_name)。然後,解析一些其他程序中的結果將是微不足道的,而不是脖子上的痛苦。或者,更好的是,如果你真的在Scapy本身使用它,只需直接從{ni.win_name: ni.name for ni in nis}中製作字典即可。 (或者,如果你正在運行Scapy的對Python的2.5或東西,dict((ni.win_name, ni.name) for ni in nis)。)


但是當你問它來回答這個問題(也許你已經捕獲的所有數據,並已經太晚了捕捉新數據,所以現在我們被困在你以前的錯誤中......),這裏有三個步驟:(1)找出如何將其中一個字符串解析爲其組成部分。 (2)在循環中構建一個將數字映射到名稱的字典。 (3)只需使用字典進行查找。

對於解析,我會使用正則表達式。例如:

<name:\S+\s(\S+).*?\{(\d+)\}> 

Regular expression visualization

Debuggex Demo

現在,讓我們構建的字典:

r = re.compile(r'<name:\S+\s(\S+).*?\{(\d+)\}>') 
matches = (r.match(thing) for thing in things) 
d = {match.group(2): match.group(1) for match in matches} 

現在:

>>> d['20092973'] 
'student' 
+0

d = {match.group(2):match.group(1)匹配匹配}顯示我無效的語法錯誤..對不起.. – Somputer

+0

@ user3683061:沒有無效的語法錯誤。至少在Python 2.7中,這是你聲稱你正在使用的。 – abarnert

+0

@ user3683061:另外請注意,我給你的模式是針對你詢問的玩具格式,而不是你的真實格式。 – abarnert

2

代碼:

def grepRole(role, lines): 
    return [line.split()[1] for line in lines if role in line][0] 

l = ["<name:john student male age=23 subject=\computer\sience_{20092973}>", 
    "<name:Ahn professor female age=61 subject=\compute\math_{20092931}>"] 
print(grepRole("{20092973}", l)) 
print(grepRole("{20092931}", l)) 

輸出:

student 
professor 
+0

謝謝!這也運作良好! – Somputer

2
current_list = ["<name:john student male age=23 subject=\computer\sience_{20092973}>", "<name:Ahn professor female age=61 subject=\computer\math_{20092931}>"] 

def get_identity(code): 
    print([row.split(' ')[1] for row in current_list if code in row][0]) 


get_identity("{20092973}") 

正則表達式很好,但對於我來說,菜鳥,正則表達式是另一大問題...

+0

謝謝!這也運作良好! – Somputer