Использование finditer () со строкой из request.FILES - PullRequest
0 голосов
/ 18 февраля 2019

Я пытаюсь разобраться с этой проблемой и пытался найти что-то в Интернете, но безрезультатно.Я загружаю файл (<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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...