2017-08-21 30 views
0

我得到了含這種方式分開行的文本文件:排序子在列表 - Python的

Action: Add Parameter 
Matched Parameter: ctl00_ContentPlaceHolderMain_RadSearchBoxNeId_ClientState 
on [HTTPS] /ConsolePage/ConsolePageWeb.aspx Matched Wildcard: * 

Action: Add Parameter 
Matched Parameter: ctl00$ContentPlaceHolderMain$HiddenFieldSelectedFilter on 
[HTTPS] /ConsolePage/ConsolePageWeb.aspx Matched Wildcard: * 

我寫了一個小腳本Python中只得到了「匹配Paramater後的字符串: 「並將其輸出到文件中,但結果未正確排序。

腳本:

import re 

pattern = "^Matched Parameter: ([^\s]+)" 
new_file = [] 

with open(".\params.txt") as txtFile: 
    lines = txtFile.readlines() 

for line in lines: 
    match = re.search(pattern, line) 
    if match: 
     new_line = match.group() 
     new_line = new_line.split(" ") 
    del new_line[0], new_line[0] 
    new_line = sorted(new_line) 
    print(new_line) 

輸出:

['ctl00_MainSplitter_ClientState'] 
['ctl00_RadWindowLicenseAggreemennt_C_RadButtonLicenseAggreemenntCancel_ClientState'] 
['ctl00_RadWindowLicenseAggreemennt_C_RadButtonLicenseAggreemenntOK_ClientState'] 
['ctl00_RadWindowLicenseAggreemennt_ClientState'] 
['ctl00$ScriptManagerMain'] 
['ctl00_RadStyleSheetManager1_TSSM'] 
['ctl00_ScriptManagerMain_TSM'] 
['__VIEWSTATE'] 
['ctl00_radwindow1_ClientState'] 
['ctl00_RadButtonLgout_ClientState'] 
['ctl00_TopPane_ClientState'] 
['ctl00_RadPanelBarMainMenu_ClientState'] 
['ctl00_LeftPane_ClientState'] 
['ctl00_ContentPlaceHolderMain_RadWindowManager1_ClientState'] 
['ctl00$ContentPlaceHolderMain$RadComboBoxTimeResolution'] 
['ctl00_ContentPlaceHolderMain_RadComboBoxTimeResolution_ClientState'] 
['ctl00_ContentPlaceHolderMain_RadSearchBoxNeId'] 
['ctl00_ContentPlaceHolderMain_RadSearchBoxNeId_ClientState'] 
['ctl00$ContentPlaceHolderMain$HiddenFieldSelectedFilter'] 
['ctl00_ContentPlaceHolderMain_AlarmsUserFilters_RadWindowAlarmsFilter_C_RadButtonAlarmsFilterClose_ClientState'] 
['ctl00_ContentPlaceHolderMain_AlarmsUserFilters_RadWindowAlarmsFilter_C_RadListBoxRuleNames_ClientState'] 
['ctl00_ContentPlaceHolderMain_AlarmsUserFilters_RadWindowAlarmsFilter_C_RadListBoxSeverity_ClientState'] 
['ctl00_ContentPlaceHolderMain_AlarmsUserFilters_RadWindowAlarmsFilter_C_RadListBoxStatus_ClientState'] 
['ctl00_ContentPlaceHolderMain_AlarmsUserFilters_RadWindowAlarmsFilter_C_RadListBoxEntityType_ClientState'] 
['ctl00_ContentPlaceHolderMain_AlarmsUserFilters_RadWindowAlarmsFilter_C_RadButtonAlarmsFilterOK_ClientState'] 
['ctl00_ContentPlaceHolderMain_AlarmsUserFilters_RadWindowAlarmsFilter_ClientState'] 
['ctl00_ContentPlaceHolderMain_AlarmsUserFilters_RadWindowFiltersList_C_RadButtonFiltersListClose_ClientState'] 
['ctl00_ContentPlaceHolderMain_AlarmsUserFilters_RadWindowFiltersList_C_RadListBoxExistingFilters_ClientState'] 
['ctl00_ContentPlaceHolderMain_AlarmsUserFilters_RadWindowFiltersList_C_RadButtonFiltersListOk_ClientState'] 
['ctl00_ContentPlaceHolderMain_AlarmsUserFilters_RadWindowFiltersList_C_RadButtonFiltersListEdit_ClientState'] 

我需要的輸出通過它進行排序是按字母順序排列的參數名字符串,例如 'AlarmsUserFilters' 前 'ClientState':

['ctl00_ContentPlaceHolderMain_AlarmsUserFilters_RadWindowAlarmsFilter_C_RadButtonAlarmsFilterClose_ClientState'] 
['ctl00_ContentPlaceHolderMain_AlarmsUserFilters_RadWindowAlarmsFilter_C_RadListBoxRuleNames_ClientState'] 
['ctl00_ContentPlaceHolderMain_AlarmsUserFilters_RadWindowAlarmsFilter_C_RadListBoxSeverity_ClientState'] 
['ctl00_ContentPlaceHolderMain_AlarmsUserFilters_RadWindowAlarmsFilter_C_RadListBoxStatus_ClientState'] 
['ctl00_ContentPlaceHolderMain_AlarmsUserFilters_RadWindowAlarmsFilter_C_RadListBoxEntityType_ClientState'] 
['ctl00_MainSplitter_ClientState'] 

任何幫助如何以最好的方式做到這一點?,我需要是通用的儘可能地,也就是說可能有不同的字符串需要按這種方式排序('ct100'等等。僅僅是一個例子)

謝謝!

+0

它似乎是拋出一個'NameError' ..如果後面的行被縮進? –

+0

你沒有排序任何東西。你的'for'循環遍歷你的數據,並按照輸入文件中的順序輸出結果;您傳遞給'sorted'的'new_line'總是一個單元素列表。 –

+0

我需要一個通用的答案,用'_'分割對於這個用例來說很好,但是將來我會看到不同的字符串。我需要一些按照一般方法對子字符串進行排序 –

回答

1

正如其他人指出的那樣,問題是你只是建立一個長度爲1的列表,在讀取整個文件之前對它進行排序然後立即進行打印。我已將您的代碼更改爲:

import re 

pattern = "Matched Parameter: ([^\s]*)" 
parameters = [] 

with open(".\\params.txt") as txtFile: 
    for line in txtFile: 
     match = re.match(pattern, line) 
     if match: 
      parameters.append(match.group(1)) 

for par in sorted(parameters): 
    print(par) 

現在應該可以正常工作。這也改變了一些其他的零星 - match.group(1)只是立即讓你匹配的組,這是你的正則表達式中括號()中的位。另外,因爲您只想從行首開始匹配,您可以使用re.match。我也直接遍歷文件的行,而不是建立行,然後迭代這些行。請注意,你是正確的,因爲它完全可以在字符串列表上使用sortsorted,因爲Python會按字母順序對它們進行比較,這通常稱爲「按字典順序排列」。

不幸的是,我可能很難提供任何有意義的示例輸出,而不花費年齡重構您的輸入,因爲我無法訪問它。