Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 将finditer()与request.FILES中的字符串一起使用_Regex_Django_Python 3.x - Fatal编程技术网

Regex 将finditer()与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

我正试图解决这个问题,并试图在互联网上找到一些东西,但没有结果。我正在上传一个文件(<2.5MB),我从request.FILES读取该文件并将其解码到
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