2015-06-04 57 views
2

this question之後,我開始考慮在字符串中添加更多的層次。例如,這是我的字符串:Python:正則表達式findall子類?

sometext 
somemore text here 

some other text 

       course: course1 

some details 
TestName: test1 
some other details 
Id    Name    marks 
____________________________________________________ 
1    student1   65 
2    student2   75 
3    MyName    69 
4    student4   43 

some details 
TestName: test3 
some other details 
Id    Name    marks 
____________________________________________________ 
1    student1   23 
3    MyName    63 
4    student4   64 


       course: course2 

some details 
TestName: test2 
some other details 
Id    Name    marks 
____________________________________________________ 
1    student1   84 
2    student3   73 

some details 
TestName: test5 
some other details 
Id    Name    marks 
____________________________________________________ 
1    MyName    84 
2    student2   73 


       course: course4 

some details 
TestName: test1 
some other details 
Id    Name    marks 
____________________________________________________ 
1    student1   58 
2    student3   89 

some details 
TestName: test2 
some other details 
Id    Name    marks 
____________________________________________________ 
1    student1   97 
3    MyName    60 
8    student6   82 

我想了解MyName的詳細信息。像(course1,test1,69),(course1,test3,63),(course2,test5,84),(course4,test2,60)或類似輸出的輸出。

我無法做到在一個單一的步驟,因此想出了這個:

import re 
eachcourse = re.split(r'course: \w+',string1) 
courselist = re.findall(r'course: (\w+)',string1) 
li =[] 
for i,course in enumerate(courselist): 
    match = re.findall(r".*?TestName: (\w+)(?:(?!\TestName\b).)*MyName\s+(\d+).*?",eachcourse[i+1],re.DOTALL) 
    li.append((course,match)) 
print li 

這給了我

[('course1', [('test1', '69'), ('test3', '63')]), ('course2', [('test5', '84')]), ('course4', [('test2', '60')])] 

是否還有更好的和更清潔的方式?

謝謝。

回答

1
x=re.findall(r"\bcourse: (\w+)(.*?)(?=(?:\bcourse:|$))",x,flags=re.DOTALL) 


print [[i[0]]+re.findall(r"TestName: (\w+)(?:(?!\bTestName\b).)*MyName\s*(\d+)",i[1],flags=re.DOTALL) for i in x] 

你可以試試這個。雖然格式不完全相同,但它是可用的。

+0

精彩!!非常感謝!只是,還有一個疑問。當Iam使用非常大的字符串時,這種方式是否可取?說25頁長的數據? 我注意到返回結果所花費的時間取決於字符串的長度以及字符串中MyName的出現次數。基於MyName For Eg的出現次數,它從0.05秒到50秒不等。在25頁的字符串中出現18次需要0.05秒,1次出現需要50.2秒。只需要建議這是否是最好的方法? – Deepa

+0

@Deepa這應該工作,但正則表達式通常不會給出好的性能。最佳方法可以解析通過CSV或其他解析器:) – vks

+0

哦好吧謝謝!請再說一次。假設我需要檢索兩個學生的詳細信息,那麼我需要重複這個第二個名字的權利? – Deepa

相關問題