有一種方法使用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