2014-03-13 87 views
1

一個特定的字符串我有一定的文件,該文件包含類似於給定格式數據搜索在python

Name : Neha xxxxx 
Title : ENGINEER.xxxxx xxxxxx 
Employee number : 27xxx 
Status : Active 
User ID : nehxxx 
Manager ID : xxxx 
Manager : Krisxxxxxxxx 

此數據將被順序地插入到database.For爲此,我是第一建築物列表通過以下代碼

filename = "LDAPFile.txt" 
lines = open(filename).read().splitlines() 

#print lines 
for item in lines: 
    if('Name') in item: 
     Name = item.split(':')[1] 
     #print Name[1] 
    if('Title') in item: 
     Title = item.split(":")[1] 
     #print Title[1] 
    if('Employee number') in item: 
     ENO = item.split(":")[1] 
     #print ENO 
    if('Status') in item: 
     Status = item.split(":")[1] 
     #print Status 
    if('User ID') in item: 
     UID = item.split(":")[1] 
     #print UID 
    if('Manager ID') in item: 
     MID = item.split(":")[1] 
     #print MID 
     #print len(MID) 
    if('Manager') in item: 
     MANAGER = item.split(":") 
     print MANAGER 
     #print len(MANAGER) 

但是,如果('經理')在項目中:導致經理ID和經理。我該如何專門搜索管理器?

+1

你試過'if('Manager:')in item'嗎?這應該工作,如果你不承擔「經理:」 – george

+0

@jonrsharpe:不會解決OP的問題,因爲「經理ID」也以「經理」開始(儘管它對所有測試都更好)。 – geoffspear

回答

1

使用Python的re的正則表達式來實現這一點。在下面的例子中它會檢查該後面沒有" ID"

if re.match("Manager(?!\s+ID)", item): 

記住的經理,這個例子僅僅是爲您的方案有效。

1

爲什麼不先拆線:

for item in lines: 
    parts = item.split(':') 
    if parts[0].strip() == "Manager": 
     # process the item 
4

可以使最小的變化是這樣的:

if item.startswith("Manager :"): 

這將是有效的,因爲你不必搜索整個字符串做,並且會避免在其他地方找到相同的字符串。

但是,可以提高整個代碼如下:

data = {} 
for item in lines: 
    try: 
     key, value = item.split(":") 
    except ValueError: 
     pass # ignore line - not in expected format 
    else: 
     data[key.strip()] = value.strip() 

現在可以在data字典

data["Manager"] ... 
+0

+1:男人,這太蠢了,我想哭。在這裏學到了一些東西。 :) – Manhattan

+0

極好的建議。但是,我的數據由新行分隔。而且,「key,value = item.split(」:「)」會拋出錯誤「需要多個值才能解包」。 – surya

+0

你的意思是由*空格*行分隔嗎?如果是這樣的話,那麼你會在這些空行上得到這個錯誤,因爲'split'只是一件事。我已經添加了一個'嘗試'來解決這些問題。 – jonrsharpe

0

我認爲它會更容易使用正則表達式中訪問領域。所以我會做的是以下幾點:

import re 

# create a list to save the whole file in it 

inf = open(filename, "r") 
read = inf.readlines() 
inf.close 

for l in read: 
    mat1 = re.search(r'Manager ID',l,re.M) 
    mat1 = re.search(r'Manager ID',l,re.M) 
    if mat1: 
    MID = l.split(":")[1] 
    elif mat2: 
    Manager = l.split(":")