Regex 将finditer()与request.FILES中的字符串一起使用
我正试图解决这个问题,并试图在互联网上找到一些东西,但没有结果。我正在上传一个文件(<2.5MB),我从request.FILES读取该文件并将其解码到Regex 将finditer()与request.FILES中的字符串一起使用,regex,django,python-3.x,Regex,Django,Python 3.x,我正试图解决这个问题,并试图在互联网上找到一些东西,但没有结果。我正在上传一个文件(2.5MB)?建议循环使用req\u file.chunks()而不是read()它的容量小于2.5MB。抱歉,我忘了提到这一点。re.finditer()返回一个生成器,因此您需要调用iter/next/for。。。在…中。似乎是从字节解码文件时。如果只是读一下就好了。 req_file = request.FILES['file'] log_string = req_file.read().decode('u
utf-8
,该文件保存在一个变量中。然后我需要正则表达式来处理这个字符串,这样我就可以遍历正则表达式匹配
奇怪的是,re.finditer()
返回其可调用的迭代器
,但没有结果,但是,如果我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
下面是上面两个代码示例的编辑:
从未输入上述for循环(这就是问题所在)
log\u字符串
在读取文件时打印到控制台,并且看起来正常
使用不同正则表达式字符串的re.search()
将在同一次编译中使用log\u string
只是想说明一下,上面的正则表达式字符串工作得非常好,这绝对不是这里的问题。问题在于对使用request.FILES['file']
保存的字符串使用re.finditer()
例如,下面的方法工作得非常好,但似乎有点冗长,只是为了让regex方法工作:
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之外的代码中执行的卡盘,因为它可以工作
实际上,我在with
语句中使用了文件字段
,因为文件是使用模型的save()
方法编写的(它可以工作):
这就是为什么我知道先写然后读文件是有效的,然而,我只是偶然发现了这一点,并希望获得一些见解。我知道它就在那里,它让我发疯:)
如果您希望使用以下内容测试正则表达式:
*************
*First Title*
*************
Lots and lots and lots of text
that fill this section up
to tell you things about something
**************
*Second Title*
**************
Some Text goes here
*************
*Third Title*
*************
Lots of text goes here
with CRs etc
and tabs
重新调试的输出:
它是一个大文件(>2.5MB)?建议循环使用req\u file.chunks()
而不是read()
它的容量小于2.5MB。抱歉,我忘了提到这一点。re.finditer()
返回一个生成器,因此您需要调用iter/next/for。。。在…
中。似乎是从字节解码文件时。如果只是读一下就好了。
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 s in re_results:
# do something with 's' (re.match) of each result.
with log_file.file_field.open(mode='r') as f:
for c in f.chunks():
log_string += c
*************
*First Title*
*************
Lots and lots and lots of text
that fill this section up
to tell you things about something
**************
*Second Title*
**************
Some Text goes here
*************
*Third Title*
*************
Lots of text goes here
with CRs etc
and tabs
LITERAL 42
SUBPATTERN 1 0 0
MAX_REPEAT 1 MAXREPEAT
NOT_LITERAL 42
LITERAL 42
IN
CATEGORY CATEGORY_SPACE
MAX_REPEAT 1 MAXREPEAT
LITERAL 42
MAX_REPEAT 2 2
IN
CATEGORY CATEGORY_SPACE
SUBPATTERN 2 0 0
BRANCH
MAX_REPEAT 1 MAXREPEAT
ASSERT_NOT 1
MAX_REPEAT 1 MAXREPEAT
LITERAL 42
LITERAL 10
MAX_REPEAT 1 MAXREPEAT
ANY None
MAX_REPEAT 1 MAXREPEAT
IN
CATEGORY CATEGORY_SPACE
ASSERT_NOT 1
MAX_REPEAT 1 MAXREPEAT
LITERAL 42
LITERAL 10
MAX_REPEAT 1 MAXREPEAT
ANY None
OR
0. INFO 8 0b1 7 MAXREPEAT (to 9)
prefix_skip 1
prefix [0x2a] ('*')
overlap [0]
9: LITERAL 0x2a ('*')
11. MARK 0
13. REPEAT_ONE 6 1 MAXREPEAT (to 20)
17. NOT_LITERAL 0x2a ('*')
19. SUCCESS
20: MARK 1
22. LITERAL 0x2a ('*')
24. IN 4 (to 29)
26. CATEGORY UNI_SPACE
28. FAILURE
29: REPEAT_ONE 6 1 MAXREPEAT (to 36)
33. LITERAL 0x2a ('*')
35. SUCCESS
36: REPEAT_ONE 9 2 2 (to 46)
40. IN 4 (to 45)
42. CATEGORY UNI_SPACE
44. FAILURE
45: SUCCESS
46: MARK 2
48. BRANCH 56 (to 105)
50. REPEAT 45 1 MAXREPEAT (to 96)
54. ASSERT_NOT 12 0 (to 67)
57. REPEAT_ONE 6 1 MAXREPEAT (to 64)
61. LITERAL 0x2a ('*')
63. SUCCESS
64: LITERAL 0xa ('\n')
66. SUCCESS
67: REPEAT_ONE 5 1 MAXREPEAT (to 73)
71. ANY
72. SUCCESS
73: REPEAT_ONE 9 1 MAXREPEAT (to 83)
77. IN 4 (to 82)
79. CATEGORY UNI_SPACE
81. FAILURE
82: SUCCESS
83: ASSERT_NOT 12 0 (to 96)
86. REPEAT_ONE 6 1 MAXREPEAT (to 93)
90. LITERAL 0x2a ('*')
92. SUCCESS
93: LITERAL 0xa ('\n')
95. SUCCESS
96: MAX_UNTIL
97. REPEAT_ONE 5 1 MAXREPEAT (to 103)
101. ANY
102. SUCCESS
103: JUMP 5 (to 109)
105: branch 3 (to 108)
106. JUMP 2 (to 109)
108: FAILURE
109: MARK 3
111. SUCCESS