使用finditer()和从request.FILES解码的字符串

时间:2019-02-18 17:31:29

标签: regex django python-3.x

我正在设法解决这个问题,并试图在互联网上找到某些东西,但无济于事。我正在上传一个文件(<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

1 个答案:

答案 0 :(得分:0)

问题在于遍历卡盘时,它会应用额外的换行符。

我手动将文件写入磁盘,以查看大块之前的情况。由于多余的换行符,正则表达式字符串不匹配任何内容。

现在的问题是,遍历大块时如何具有与open('file.txt', 'r', newline='')相同的功能?