0

Python新手在这里。我正在尝试搜索大型文档并提取文本。我需要的实际数据是括号内的值:xx(bb) xx(bb) xx 可以是任何数字组合,而 bb 是任何包含数字的字符,因此您可以拥有包含 1(YJ) 2(*) 的行。最终目标是将括号内的字符与集合中的值进行比较:{'hO', 'Ih', 'Dn', '8', 'MF', 'dC', '6', 'RE', 'WM'、'Dh'、'5'}。所以我会检查 YJ 和 * 是否在集合内

为此,我编写了几个方法来解析这个巨大的文件。问题是,这需要很长时间。对于大约 1.5GB 的文件,需要 49 秒。对于大于 5GB 的文件,搜索需要 5 分钟:

方法 1 有效并打印出该行,但与此处的所有方法一样,它很慢:

with open(filename, 'rb', buffering=102400) as f:
    time_data_count = 0
    for line in f:
        # if b'(X,Y)' in line:
        #     print(line)
        if re.search(b'\d+\(.+\)\s+\d+\(.+\)', line) :  
                print(line)

方法 2。此方法的另一个问题是它总是不返回任何内容。为什么?

with open(filename, 'rb') as f:
    #text = []
    while True:
        memcap = f.read(102400)
        if not memcap:
            break
        text = re.search(b'\d+\(.+\)\s+\d+\(.+\)',memcap)
        if text is None:
            print("none")

方法 3:除非文件小于 1GB,否则仅打印 1 个元素的列表。为什么是这样?:

with open(filename, 'rb') as f:
    time_data_count = 0
    text = []
    while True:
        memcap = f.read(102400)
        if not memcap:
            break
        text = re.findall(b'\d+\(.+\)\s+\d+\(.+\)',memcap) 
    print(text)

这就是我写的三种方法。只有 1 可以正常工作。但他们都有一个慢的问题。Python Regex 一般是不是很慢?有没有不同的方法来获得我需要的值类型而不必使用正则表达式?我认为使用二进制和文件缓冲区会有所帮助,但这已经尽可能快了。请帮忙

4

1 回答 1

1

如果您使用相同的正则表达式模式进行大量搜索,您应该使用re.compile

with open(filename, 'rb', buffering=102400) as f:
    time_data_count = 0
    search_pattern = re.compile(b'\d+\(.+\)\s+\d+\(.+\)')
    for line in f:
        if search_pattern.search(line):  
                print(line)
于 2020-06-05T17:37:50.520 回答