Я пытаюсь разобраться с этой проблемой и пытался найти что-то в Интернете, но безрезультатно.Я загружаю файл (<2,5 МБ), который я читаю из request.FILES и декодирую его в <code>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 для этого), но он все еще не работает, когда он достигает 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 s in re_results:
# do something with 's' (re.match) of each result.
Указанный выше цикл for никогда не вводится (что является проблемой)
log_string
выводит на консоль каждый раз, когда файл читается и выглядит нормально.
re.search()
с другой строкой регулярных выражений будет работать с использованием log_string
в той же компиляции.
Просто чтобы прояснить это, приведенная выше строка Regex прекрасно работает, и здесь она определенно не является проблемой.Проблема заключается в использовании re.finditer()
для строки, которая была сохранена с использованием 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 s in re_results:
# do something with 's' (re.match) of each result.
Указанный выше цикл for успешно введен и выполняет код для совпадений.
Это связано с тем, что он читается из памяти?Я что-то упускаю здесь очень очевидное?
РЕДАКТИРОВАТЬ
Я знаю, что рекомендуемый способ - пройти через чаки, которые я выполняю в коде вне Stackoverflow, потому чтоработает.
Я на самом деле использую FileField
в операторе with
, потому что файл написан с использованием метода save()
модели (работает):
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
Вывод из re.DEBUG:
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