我正在设法解决这个问题,并试图在互联网上找到某些东西,但无济于事。我正在上传一个文件(<2.5MB),该文件是从request.FILES中读取的,并将其解码为utf-8
,该文件保存在变量中。然后,我需要用正则表达式来处理该字符串,以便可以迭代正则表达式匹配。
奇怪的是,re.finditer()
返回其可调用的迭代器<callable_iterator object at 0x05D49350>
,但没有结果,但是,如果我open('file.txt', 'w', newline='')
和open('file.txt', 'r')
,则re.finditer()
可以正常工作
req_file = request.FILES['file']
log_string = req_file.read().decode('utf-8', 'ignore')
req_file.close()
sect_re = re.compile(
r'\*(?P<title>[^*]+)\*\s\*+\s{2,3}(?P<body>(?:(?!\*+\n).+\s+(?!\*+\n))+.+|)',
re.M
)
re_results = re.finditer(sect_re, log_string) # loop through the regex results
我也尝试过此操作(我忘记了chunks()
是UploadFile
的选项。感谢dirkgroten的帮助),但是到达{{ 1}}:
re.finditer()
下面是上面两个代码示例的编辑内容:
req_file = request.FILES['file']
log_string = ""
for c in req_file.chunks():
log_string += c.decode('utf-8', 'ignore')
sect_re = re.compile(
r'\*(?P<title>[^*]+)\*\s\*+\s{2,3}(?P<body>(?:(?!\*+\n).+\s+(?!\*+\n))+.+|)',
re.M
)
re_results = re.finditer(sect_re, log_string) # loop through the regex results
上面的for循环永远不会输入(这是问题所在)
for s in re_results:
# do something with 's' (re.match) of each result.
会在每次读取文件并且看起来不错时打印到控制台。
log_string
将在同一编译中使用re.search()
。
只需说清楚一点,上面的Regex字符串就可以正常工作,这绝对不是问题所在。问题是在使用log_string
保存的字符串上使用re.finditer()
。
例如,下面的代码可以很好地工作,但是为了使regex方法正常工作似乎有些麻烦:
request.FILES['file']
以下代码作为编辑:
req_file = request.FILES['file']
log_string = req_file.read().decode('utf-8', 'ignore')
req_file.close()
with open("file.txt", 'w', newline='') as f:
f.write(log_string)
new_log_string = ""
with open('file.txt', 'r') as f:
new_log_string = f.read()
sect_re = re.compile(
r'\*(?P<title>[^*]+)\*\s\*+\s{2,3}(?P<body>(?:(?!\*+\n).+\s+(?!\*+\n))+.+|)',
re.M
)
re_results = re.finditer(sect_re, new_log_string) # loop through the regex results
上面的for循环已成功输入并在比赛中执行代码。
这与从内存中读取有关吗?我在这里错过了很明显的东西吗?
编辑
我知道推荐的方法是遍历我在Stackoverflow之外的代码中所做的工作,因为它可以工作。
我实际上是在for s in re_results:
# do something with 's' (re.match) of each result.
语句中使用FileField
,因为该文件是使用模型的with
方法编写的(有效):
save()
这就是为什么我知道先写然后读文件的原因,但是,这只是我遇到了这个问题,并且需要一些见识。我知道它在那里,它让我发疯:)
如果您想通过以下方式测试正则表达式:
with log_file.file_field.open(mode='r') as f:
for c in f.chunks():
log_string += c
答案 0 :(得分:0)
问题在于遍历卡盘时,它会应用额外的换行符。
我手动将文件写入磁盘,以查看大块之前的情况。由于多余的换行符,正则表达式字符串不匹配任何内容。
现在的问题是,遍历大块时如何具有与open('file.txt', 'r', newline='')
相同的功能?