2013-08-24 60 views
1

我試圖在行首(---)的三個連字符後面捕獲文件中的所有剩餘文本。匹配系列連字符後的所有內容

實施例:所述第一組的三個連字符後

 
Anything above this first set of hyphens should not be captured. 

--- 

This is content. It should be captured. 
Any sets of three hyphens beyond this point should be ignored. 

一切都應該被捕獲。最近我得到的是使用這個正則表達式[^(---)]+$稍微工作。它會捕捉連字符後面的所有內容,但如果用戶在該點之後放置任何連字符,則會在最後一個連字符後捕捉用戶放置的連字符。

我正在使用這個結合python來捕獲文本。

如果有人能幫我理清這個正則表達式問題,我會很感激。

回答

1
pat = re.compile(r'(?ms)^---(.*)\Z') 

(?ms)增加了MULTILINEDOTALL標誌。

MULTILINE標誌使^匹配行的開頭(不是字符串剛開始的時候)。我們需要這個,因爲---發生在一行的開頭,但不一定是字符串的開頭。

DOTALL標誌使.匹配任何字符,包括換行符。我們需要這個,以便(.*)可以匹配多個行。

\Z匹配字符串的末尾(而不是行尾)。

例如,

import re 

text = '''\  
Anything above this first set of hyphens should not be captured. 

--- 

This is content. It should be captured. 
Any sets of three hyphens beyond this point should be ignored. 
''' 

pat = re.compile(r'(?ms)^---(.*)\Z') 
print(re.search(pat, text).group(1)) 

打印

This is content. It should be captured. 
Any sets of three hyphens beyond this point should be ignored. 

注意,當你定義一個括號,[...]正則表達式字符類,括號內的東西是(在一般情況下,除了例如a-z等連字符)解釋爲單個字符。他們不是模式。因此[---][-]沒有區別。實際上,[---]是從--(含)的字符範圍。

字符類內的圓括號也被解釋爲文字圓括號,而不是分組分隔符。所以[(---)]等於[-()],字符類包括連字符和左右括號。

因此字符類[^(---)]+匹配比連字號或括號以外的任何字符:

In [23]: re.search('[^(---)]+', 'foo - bar').group() 
Out[23]: 'foo ' 

In [24]: re.search('[^(---)]+', 'foo (bar').group() 
Out[24]: 'foo ' 

你可以看到這是怎麼回事,爲什麼它不適合您的問題的工作。

+0

感謝您的幫助。這個解釋很有幫助,更不用說它完美了。 – Battleroid

1

對不起,不直接回答你的問題,但我想知道正則表達式是否過度複雜的問題?你可以這樣做:

f = open('myfile', 'r') 

for i in f: 
    if i[:3] == "---": 
     break 

text = f.readlines() 

f.close() 

或者,我錯過了什麼?

我傾向於認爲正則表達式是足夠的難以維持,如果你不需要他們的獨特能力對於一個給定的目的,將是更清潔,更可讀,以避免使用它們完全。

1
s = open(myfile).read().split('\n\n---\n\n', 1) 
print s[0] # first part 
print s[1] # second part after the dashes 

這應該適用於您的示例。第二個分割參數指定分割字符串的次數。

相關問題