打印

2013-03-13 57 views
0

我想打印特定的字符串之間的線特定模式之間的界限,我的字符串如下:打印

my_string = ''' 
##start/file1 
file/images/graphs/main 
file/images/graphs 
file/graphs 

##start/new 
new/pattern/symbol 
new/pattern/ 

##start/info/version 
version/info/main 
version/info/minor 

##start 
values/key 
values 
... 
... ''' 

在此字符串我想搜索「主」,並打印爲:

##start/file1/file/images/graphs/main 
##start/info/version/version/info/main 

我該怎麼做? 我試圖找到兩個## start之間的行並搜索main。

回答

0

嘗試類似:

def get_mains(my_string): 
    section = '' 

    for line in my_string.split('\n'): 
     if line[0:7] == "##start": 
      section = line 
      continue 
     if 'main' in line: 
      yield '/'.join([section, line]) 

for main in get_mains(my_string): 
    print main 
0

有一種方法使用Python的正則表達式解析器這樣做叫正則表達式的簡稱。

基本上,正則表達式就是用於搜索字符串中某些模式的整個語言。如果我有字符串'Hello, World',它將匹配正則表達式模式'llo, Wor',因爲它包含一個ell,後跟一個ell,後跟一個o,後面跟着一個逗號和一個空格,並且大寫double-you等等。表面上它看起來像一個子串測試。正則表達式的真正威力來自特殊字符。如果我再次輸入了字符串'Hello, World',則它也與'Hello, \w\w\w\w\w'匹配,因爲\w是一個特殊字符,代表字母表中的任何字母(加上一些額外字符)。所以'Hello, Bobby','Hello, World','Hello, kitty'都匹配模式'Hello, \w\w\w\w\w',因爲\w可以代表任何字母。這些'特殊字符'還有很多,它們都非常有用。要真正回答你的問題,

我構建了一個符合

##start\textICareAbout 
file_I_don't_care 
file_I_don't_care 
file_I_care_about\main 

這是

r'(##start{line}){line}*?(.*main)'.format(line=r'(?:.*\n)') 

主導,使串原始字符串(所以我們不必加倍模式反斜線換行符,請參閱鏈接的網頁)。然後,括號中的所有內容都成爲一個組。團體是我們希望能夠在以後回憶的文本。有兩個組。第一個是(##start{line}),第二個是(.*main)。第一組匹配任何以##start開頭並繼續整行的內容,所以行如 ##start/file1##start/new 第二組匹配以main結尾的行,因爲.*匹配除換行符之外的每個字符。在兩組之間有{line}*,這意味着'匹配任何完整的行,並匹配任意數量的行'。因此,將它們結合在一起,我們有: 匹配以##start開頭的任何內容,然後我們匹配任意數量的行,然後匹配任何以main結尾的行。

import re 

# define my_string here 

pattern = re.compile(r'(##start{line}){line}*?(.*main)'.format(line=r'(?:.*\n)')) 

for match in pattern.findall(my_string): 
    string = match[0][:-1] # don't want the trailing \n 
    string += '/' 
    string += match[1] 
    print string 

對於你的榜樣,它輸出

##start/file1/file/images/graphs/main 
##start/new/version/info/main 

所以正則表達式是很酷,其他語言有它。這是一個非常強大的工具,你應該學會如何使用它here。 也只是一個側面說明,我使用。格式功能,因爲我認爲它看起來更清潔,更易於閱讀,因此 'hello{line}world'.format(line=r'(?:.*\n)')只是變得評估,以'hello(?:.*\n)world',並會匹配

hello 
Any Text Here. Anything at all. (just for one line) 
world