2013-08-24 24 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 

这应该适用于您的示例。第二个分割参数指定分割字符串的次数。

相关问题