import re garant_pdf_regex = [ "\d+(?:\.\d{2})?%", "\d+(?:\.\d{2})? Российский рубль", "((?:не требуется)|(?:не установлены))" ] def normalize_whitespaces(text): return re.sub("\s+", "", text).lower() value1 = normalize_whitespaces('Обеспечение гарантийных обязательств') value2 = normalize_whitespaces('Обеспечение гарантийных') def detect_garant_pdf(pdf_blocks, debug_print): garant_pdf = None for i, block in enumerate(pdf_blocks): check = ( value1 in normalize_whitespaces(block) and value1 in normalize_whitespaces(pdf_blocks[i + 1]) or value2 in normalize_whitespaces(block) and value2 in normalize_whitespaces(pdf_blocks[i + 1]) ) if check: text = re.sub("\s+", " ", pdf_blocks[i + 1]) if "не требуется" in text: garant_pdf = "не требуется" elif "не" in text: garant_pdf = "не требуется" else: paragraphs_to_check = pdf_blocks[i + 2] + "\n" + pdf_blocks[i + 3] if debug_print: print("PDF_TEXT", paragraphs_to_check) print("-" * 70) for val in garant_pdf_regex: if garant_pdf := re.findall(val, paragraphs_to_check): garant_pdf = garant_pdf[0] break return garant_pdf docx_regex = [ "\d+(?:[.,]\d{1})? ?%", r"\d+(?:[.,]\d{1})? ?процент", "(\d{1,3} ?%) начальной", "не установлен(?:ы|о)", "не устанавливается", "(\d{1,3} ?%) от начальной", "(\d{1,3} ?%) от цены", "(\d{1,3} ?%) процент", "\d{1,3} процент", ] def detect_garant_doc(paragraphs, debug_print=False): garant_docx = None for i, docpara in enumerate(paragraphs): if "Обеспечение гарантийных обязательств" == docpara: text = paragraphs[i + 1].removeprefix("10. Обеспечение гарантийных обязательств") if debug_print: print("DOCX_TEXT", text) print("-" * 70) for val in docx_regex: if garant_docx := re.findall(val, text): break else: for string in [ "размер обеспечения гарантийных обязательств", "обеспечение гарантийных обязательств в размере", "требования к обеспечению гарантийных обязательств не установлены", "обеспечение гарантийных обязательств не устанавливается", "размер обеспечения гарантийных обязательств", "обеспечения гарантийных обязательств в размере", "обеспечение гарантийных обязательств устанавливается в размере" ]: if not garant_docx and string.lower() in docpara.lower(): for val in docx_regex: if garant_docx := re.findall(val, paragraphs[i]): break if garant_docx: garant_docx = ( garant_docx[0] .replace("процент", "%") .replace(",", ".") ) return garant_docx docx_regex_price = [ r"\d[\d ]+(?:[.,] ?\d{2})? ?руб", "\d{1,3}(?:\s\d{3})*(?:\,\d+)? ?руб", "\d{1,3}(?:\s\d{3})*(?:\.\d+)? ?руб", "не установлен(?:ы|о)", "не устанавливается" , ] def detect_garant_doc_price(paragraphs, debug_print=False): price_doc = None for i, docpara in enumerate(paragraphs): if "Обеспечение гарантийных обязательств" == docpara: text = paragraphs[i + 1].removeprefix("10. Обеспечение гарантийных обязательств") for val in docx_regex_price: if price_doc := re.findall(val, text): # return text if debug_print: print("GARANT_DOC_PRICE: ", text) break else: for string in [ "размер обеспечения гарантийных обязательств", "обеспечение гарантийных обязательств в размере", "требования к обеспечению гарантийных обязательств не установлены", "обеспечение гарантийных обязательств не устанавливается", "размер обеспечения гарантийных обязательств", "обеспечения гарантийных обязательств в размере", "подлежит предоставлению обеспечение гарантийных обязательств в размере" ]: if not price_doc and string.lower() in docpara.lower(): for val in docx_regex_price: if price_doc := re.findall(val, paragraphs[i]): if debug_print: print("GARANT_DOC_PRICE: ", paragraphs[i]) break if not price_doc: price_doc = None else: price_doc = price_doc[0] return price_doc