2010-03-02 71 views

回答

2

也许你应该更清楚地提出你的问题,就像你想要做的一样。也就是说,你可以将文件整理成一个整个字符串,并使用re匹配你的模式。

import re 
data=open("file").read() 
pat=re.compile("^.*pattern.*$",re.M|re.DOTALL) 
print pat.findall(data) 

有没有更好的方法来做你想做的,不管它是什么,没有。

+0

因为。*是贪婪的,只会在文件中找到'pattern'的一个实例。由于您指定了re.M标志,所以$在文件中的每一个换行符之前匹配,所以使用greedy。*和re.DOTALL时,第一个。*将匹配文件中最后一个“模式”之前的所有内容,第二个将会匹配匹配最后一个'模式'后的所有内容。无论如何, – 2010-03-02 12:44:49

+1

。这不是一个完整的解决方案,因为我们不确定OP真正想做什么。我能做的最好的就是告诉他他可以将整个文件作为字符串读取,并像正常字符串一样对其执行正则表达式。 – ghostdog74 2010-03-02 12:55:07

10

将整个文件读入一个字符串,然后\ A只匹配字符串的开头,而\ Z只匹配字符串的结尾。使用re.MULTILINE,'^'匹配换行符后面的字符串的开头,'$'匹配换行符前面的字符串的末尾。请参阅re syntax的Python文档。

import re 

data = '''sentence one. 
sentence two. 
a bad sentence 
sentence three. 
sentence four.''' 

# find lines ending in a period 
print re.findall(r'^.*\.$',data,re.MULTILINE) 
# match if the first line ends in a period 
print re.findall(r'\A^.*\.$',data,re.MULTILINE) 
# match if the last line ends in a period. 
print re.findall(r'^.*\.$\Z',data,re.MULTILINE) 

输出:

['sentence one.', 'sentence two.', 'sentence three.', 'sentence four.'] 
['sentence one.'] 
['sentence four.'] 
相关问题