Python中re.findall的明显限制

Python中re.findall的明显限制,python,regex,data-analysis,Python,Regex,Data Analysis,我有一个包含数据(定义一些数学对象)的文件,其格式不方便,我想使用Python 3将其转换为JSON。由于文件很大(它包含921497个对象,每个对象都需要定义几行),我使用模块mmap加载我使用re.findall分析的内容。我的问题是,我只得到了前99999个条目,我想知道限制来自哪里?我没有发现任何错误,也找不到对此的解释 我做了一些小测试来寻找限制,但我得到的数字远远大于99999: >>> import re >>> len(re.search(r"

我有一个包含数据(定义一些数学对象)的文件,其格式不方便,我想使用Python 3将其转换为JSON。由于文件很大(它包含921497个对象,每个对象都需要定义几行),我使用模块
mmap
加载我使用
re.findall
分析的内容。我的问题是,我只得到了前99999个条目,我想知道限制来自哪里?我没有发现任何错误,也找不到对此的解释

我做了一些小测试来寻找限制,但我得到的数字远远大于99999:

>>> import re
>>> len(re.search(r"a{1,9999999}", "a"*(2*10**6)).group())
2000000
>>> len(re.findall(r"a", "a"*(2*10**6)))
2000000
>>> import sre_constants
>>> sre_constants.MAXGROUPS
2147483647
有没有人知道如何超越这一限制,或者有没有更好的方法来收集数据


我的代码(保存文件之前)如下所示:

"""
Transform dataset for CICY 4-fold to JSON

arxiv: 1303.1832
http://www-thphys.physics.ox.ac.uk/projects/CalabiYau/Cicy4folds/index.html
"""

import os, mmap, json, tarfile, tempfile
import regex as re

CICY4_REGEX = b"""\
MATRIX NUMBER :\s+(\d+)
SIZE :\s+(\d+)\s+(\d+)
EULERNUMBER :\s+(\d+)
([\d\s\|]+)
"""
cicy4_pattern = re.compile(CICY4_REGEX, re.MULTILINE)

json_data = {}
last_ind = 0

with open('cicy4folds.txt', 'r') as f,\
        mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) as m:

    for data in cicy4_pattern.findall(m):

        dic = {"vec": [], "matrix": []}

        ind = int(data[0])
        if ind != last_ind + 1:
            print(ind)
        last_ind = ind

        #dic["id"] = int(data[0])
        dic["size"] = (int(data[1]), int(data[2]))
        dic["euler"] = int(data[3])

        for line in data[4].decode("utf-8").split("\n")[:-1]:
            ind, row = line.split(" | ")
            dic["vec"].append(int(ind))
            dic["matrix"].append(list(map(int, row.split())))

        json_data[int(data[0])] = dic

print("Size: ", len(json_data))
可以找到文件
cicy4folds.txt
。以下是两个数据示例:

MATRIX NUMBER : 26538
SIZE :   6 10
EULERNUMBER :  480
1 | 0 0 0 0 0 0 0 0 1 1
1 | 0 0 0 0 0 0 1 1 0 0
1 | 0 0 0 0 1 1 0 0 0 0
1 | 0 0 1 1 0 0 0 0 0 0
1 | 1 1 0 0 0 0 0 0 0 0
9 | 1 1 1 1 1 1 1 1 1 1

MATRIX NUMBER : 26539
SIZE :   6  4
EULERNUMBER :  720
1 | 0 0 0 2
1 | 0 0 0 2
1 | 0 0 1 1
1 | 0 0 1 1
2 | 1 1 0 1
2 | 1 1 1 0
这是你的正则表达式:)

您可以将其更改为:

 CICY4_REGEX = b"""\
 MATRIX NUMBER :\s*(\d+)
 SIZE :\s+(\d+)\s+(\d+)
 EULERNUMBER :\s+(\d+)
 ([\d\s\|]+)
 """

您是否尝试过使用cicy4_模式的数据
。FindItemer(m):
?我尝试过,在本例中只得到9个结果。谢谢!我觉得自己很愚蠢,因为由于正则表达式中的一个类似错误,我已经错过了前100000个例子中的大约1000个。我只是不相信他们不会在这个地方包括空间…