使用python执行正则表达式时出错

问题描述 投票:0回答:1

文件“catalogo_no_linebreak.txt”包含产品列表,分组在一行中,我正在使用正则表达式(re.split())来尝试 保存到“saida.txt”文件后,检索每个产品和徽标的记录。

txt_format() 函数是我处理和使用正则表达式“result = re.split(r',00', arq.readline())”的地方。

我使用正则表达式处理返回不完整的产品记录的方式,我们可以看到它以红色突出显示。

如何检索模式为“0453.[内容],00”的每个产品的内容?

赛达.txt

0453.000045-00453.213.00022733-0UMA ALIANÇA, DE: OURO,  OURO BRANCO; CONSTAM: amolgada(s), PESOLOTE: 4,40G (QUATRO GRAMAS E QUARENTA CENTIGRAMAS)R$ 652,00
0453.000047-70453.213.00022959-6DUAS ALIANÇASCOM 3 ELOS CADA, DE: OURO; CONSTAM: amolgada(s),inscrições, PESO LOTE: 4
G (QUATRO GRAMAS)R$ 529,00
0453.000053-10453.213.00023492-1QUATRO ANÉIS, DOIS BRINCOS, UMA PULSEIRA, DE: OURO,  OURO BAIXO,2,93G; CONTÉM: diamantes,  massa,  pedra branca,  pedras; CONSTAM:amolgada(s), PESO LOTE: 31,98G (TRINTA E UM GRAMAS E NOVENTA E OITOCENTIGRAMAS)R$ 2.196,00

输出saida.txt产品记录返回“broken”

catalogo_no_linebreak.txt

0453.000001-90453.213.00000175-7DUAS ALIANÇAS, SEIS ANÉIS, DUAS PULSEIRAS, DE: OURO BRANCO,  OURO;CONTÉM: diamantes,  pedras,  pérola cultivada; CONSTAM: amolgada(s),inscrições, PESO LOTE: 17,99G (DEZESSETE GRAMAS E NOVENTA E NOVECENTIGRAMAS)0453.000002-70453.213.00000571-0UM ANEL, DOIS BRINCOS, UM COLAR, UM PENDENTE, DE: OURO; CONTÉM:pérola cultivada, PESO LOTE: 4,82G (QUATRO GRAMAS E OITENTA E DOISCENTIGRAMAS)R$ 623,000453.000005-10453.213.00001496-4UM ALFINETE, TRES ANÉIS, DOIS BRINCOS, QUATRO COLARES, UMPENDENTE, DUAS PULSEIRAS, DE: OURO BRANCO,  OURO; CONTÉM: coral,pérola cultivada,  diamantes, 1 D BRI KL VS APROX 0,25CT E 1 D LAP BRASIL KLVS APROX 0,40CT CC, PESO LOTE: 81,70G (OITENTA E UM GRAMAS ESETENTA CENTIGRAMAS)R$ 10.587,00

转换PdfToTxt.py

from PyPDF2 import PdfReader
import re
import os.path

pdf_reader = PdfReader("catalogo.pdf")
parts = []

def set_number_of_pages():
    total_pages = len(pdf_reader.pages)
    valid_pages = total_pages - 2
    return valid_pages

def get_number_of_pages():
   return set_number_of_pages()

def visitor_body(text, cm, tm, fontDict, fontSize):
    y = tm[5]
    if y > 0 and y < 750:
        parts.append(text)

def txt_save():
    numberOfpages = get_number_of_pages()

    for i in range(1, numberOfpages):
        page = pdf_reader.pages[i]
        page.extract_text(visitor_text=visitor_body)
        text_body = "".join(parts)

    with open("catalogo.txt", mode='a+', encoding='utf-8') as file:
        file.write(text_body + "\n")

def remove_line_break():
    file = open("catalogo.txt", mode="r", encoding="utf-8")

    for line in file.readlines():
        a = line.rstrip('\n')
        with open("catalogo_no_linebreak.txt", mode='a+', encoding='utf-8') as arq:
            arq.write('{}'.format(a))
    file.close()

def txt_format():
    with open('catalogo_no_linebreak.txt', mode='r', encoding='utf-8') as arq:
        result = re.split(r',00', arq.readline())

        for item in result:
            with open('saida.txt', mode='a+', encoding='utf-8') as arq:
                arq.write(item + '\n')

def delete_files():
    file_catalog = os.path.isfile('catalogo.txt')
    file_catalog_no_linebreak = os.path.isfile('catalogo_no_linebreak.txt')

    if file_catalog:
        os.remove('catalogo.txt')

    if file_catalog_no_linebreak:
        os.remove('catalogo_no_linebreak.txt')

def convert_to_txt():
    txt_save()
    remove_line_break()
    txt_format()

def start():
    if pdf_reader:
        print('Encontrou o catalogo!')
        convert_to_txt()
        delete_files()

start()
python regex regex-group
1个回答
0
投票

此代码假设每个产品线都以相同格式的 ID 开头。然后使用ID分隔文本并打印ID和内容而不换行

解决方案

import re

content = """
0453.000045-00453.213.00022733-0UMA ALIANÇA, DE: OURO,  OURO BRANCO; CONSTAM: amolgada(s), PESOLOTE: 4,40G (QUATRO GRAMAS E QUARENTA CENTIGRAMAS)R$ 652,00
0453.000047-70453.213.00022959-6DUAS ALIANÇASCOM 3 ELOS CADA, DE: OURO; CONSTAM: amolgada(s),inscrições, PESO LOTE: 4
G (QUATRO GRAMAS)R$ 529,00
0453.000053-10453.213.00023492-1QUATRO ANÉIS, DOIS BRINCOS, UMA PULSEIRA, DE: OURO,  OURO BAIXO,2,93G; CONTÉM: diamantes,  massa,  pedra branca,  pedras; CONSTAM:amolgada(s), PESO LOTE: 31,98G (TRINTA E UM GRAMAS E NOVENTA E OITOCENTIGRAMAS)R$ 2.196,00
"""

pattern_base=r'(\d{4}\.\d{6}-\d{5}\.\d{3}\.\d{8}-\w+)'

result = re.split(pattern_base,content)

for section in result:
    if section != "\n":
        if re.match(pattern_base, section):
            print('head: '+ section)
        else :
            section = section.replace("\n", " ")
            section = section.replace("  ", " ")
            section = section.strip()
            print('content: '+section)

输出

head: 0453.000045-00453.213.00022733-0UMA
content: ALIANÇA, DE: OURO, OURO BRANCO; CONSTAM: amolgada(s), PESOLOTE: 4,40G (QUATRO GRAMAS E QUARENTA CENTIGRAMAS)R$ 652,00
head: 0453.000047-70453.213.00022959-6DUAS
content: ALIANÇASCOM 3 ELOS CADA, DE: OURO; CONSTAM: amolgada(s),inscrições, PESO LOTE: 4 G (QUATRO GRAMAS)R$ 529,00
head: 0453.000053-10453.213.00023492-1QUATRO
content: ANÉIS, DOIS BRINCOS, UMA PULSEIRA, DE: OURO, OURO BAIXO,2,93G; CONTÉM: diamantes, massa, pedra branca, pedras; CONSTAM:amolgada(s), PESO LOTE: 31,98G (TRINTA E UM GRAMAS E NOVENTA E OITOCENTIGRAMAS)R$ 2.196,00
© www.soinside.com 2019 - 2024. All rights reserved.