我想将正则表达式应用于文件的内容而不将整个文件加载到字符串中。 RegexObject将第一个参数作为字符串或缓冲区。有没有办法将文件转换为缓冲区?
答案 0 :(得分:4)
是的!试试mmap:
您可以使用re模块搜索内存映射文件
答案 1 :(得分:2)
来自Python doc的引用:
缓冲区对象不是直接的 由Python语法支持,但可以 通过调用内置函数创建 function buffer()。
还有一些有趣的部分:
缓冲区(对象[,偏移[,大小]])
object参数必须是一个对象 支持缓冲区调用接口 (例如字符串,数组和 缓冲器)。[...]
文件对象没有实现缓冲区接口 - 因此您必须将其内容更改为字符串(f.read()
)或数组(使用mmap)。
答案 2 :(得分:1)
一次读取一行文件并将reg exp应用于该行。似乎堆积起来处理字符串。 http://docs.python.org/library/re.html包含更多详细信息,但我无法找到有关缓冲区的任何内容。
答案 3 :(得分:0)
自己做缓冲。加载一个块,如果正则表达式匹配块的一部分,从块中删除该部分,携带未使用的部分,读取下一个块,重复。
如果正则表达式被设计为具有特定的理论最大值,则在没有匹配且缓冲区处于最大值的情况下,清除缓冲区,读入下一个块。一般的正则表达式不是为处理非常大的数据块而设计的。正则表达式越复杂,它就越需要回溯。
答案 4 :(得分:0)
以下代码演示:
假设:所有句子长度相同
# import random for randomly choosing in a list
import random
# import re for regular expression matching
import re
#open a new file for read/writing
file = open("TEST", "r+")
# some strings to put in the sentence
typesOfSentences = ["test", "flop", "bork", "flat", "pork"]
# number of types of sentences
numTypes = len(typesOfSentences)
# for i values 0 to 99
for i in range(100):
# Create a random sentence for example
# "This is a test sentence 01"
sentence = "This is a %s sentence %02d\n" % (random.choice(typesOfSentences), i)
# write the sentence to the file
file.write(sentence)
# Go back to beginning of file
file.seek(0)
# print out the whole file
for line in file:
print line
# Determine the length of the sentence
length = len(sentence)
# go to 20th sentence from the beginning
file.seek(length * 20)
# create a regex matching the type and the number at the end
pathPattern = re.compile("This is a (.*?) sentence (\d\d)")
# print the next ten types and numbers
for i in range(10):
# read the next line
line = file.readline()
# match the regex
match = pathPattern.match(line)
# if there was a match
if match:
# NOTE: match.group(0) is always the entire sentence
# Print type of sentence it was and it's number
print "Sentence %02d is of type %s" % (int(match.group(2)), match.group(1))