Работа со строкой. Удаление текста до и после слов-маркеров.

Lancellot

Новичок
Пользователь
Апр 30, 2020
22
4
3
Добрый день.
Прошу помощи, какие методы использовать.

Переменная text содержит текстовый контент, сформированный путём распознавания текста на изображение, используя tesseract

Python:
from PIL import Image
import pytesseract
import string

pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files (x86)\Tesseract-OCR\tesseract.exe'
im = Image.open("Screens/test2.jpg")
text = pytesseract.image_to_string(im, lang = 'rus')
print(text)

переменная text выводит контент примерно следующего содержания:
Код:
ненужный текстовый контент МАРКЕР_1
НУЖНЫЙ КОНТЕНТ
МАРКЕР_2 ненужный текстовый контент

Задача: удалить весь текст до МАРКЕР_1 и после МАРКЕР_2, оставив то, что между этими маркерами т.е. НУЖНЫЙ КОНТЕНТ
 
  • Мне нравится
Реакции: Student

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Можно просто на срезах сделать:
Python:
s = '''
ненужный текстовый контент МАРКЕР_1
НУЖНЫЙ КОНТЕНТ
МАРКЕР_2 ненужный текстовый контент
'''
i1 = s.index('МАРКЕР_1')
l1 = len('МАРКЕР_1')
i2 = s.index('МАРКЕР_2')

s = s[i1 + l1: i2].strip()

print(s)
 
  • Мне нравится
Реакции: Student и Lancellot

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Есть какая-либо возможность убрать этот мусор? нужен только почтовый адрес.
В вашем примере между адресом и мусором больше одной пустой строки, можно фильтровать на основании этого.
Вот пример:
Python:
s = '''Шпинчевскому В.В.
ул. Винницкая,

д. №, кв. №,

г. Москва, 119192



на № от

О строительстве УДС -
23 мкр. Раменки'''

# разбиваем текст на строки
s = s.split('\n')
# список для результата
s2 = []
# счетчик пустых строк
count = 0
# цикл по списку со строками
for i in s:
    # если строка не пустая
    if i != '':
        # добавляем в результат и обнуляем счетчик
        s2.append(i)
        count = 0
    # если строка пустая и перед ней не было пустой строки
    elif i == '' and count == 0:
        # добавляем к результату
        s2.append(i)
        # увеличиваем счетчик
        count += 1
    # если строка пустая и до нее была пустая
    else:
        # выходим из цикла
        break

# соединяем строки обратно в текст
s2 = '\n'.join(s2)
# выводим в консоль
print(s2)
 
  • Мне нравится
Реакции: Student и Lancellot

weamagic

Пользователь
Пользователь
Июл 11, 2020
141
13
18
В вашем примере между адресом и мусором больше одной пустой строки, можно фильтровать на основании этого.
Вот пример:
Если я правильно опознал документы, то это не показатель. Такие письма, частенько, пишут, как хотят: кто с пустой строкой, кто без.
 
  • Мне нравится
Реакции: Student и Lancellot

Lancellot

Новичок
Пользователь
Апр 30, 2020
22
4
3
Всё отлично получилось. Но возникла ещё одна ситуация.
В нужный текст всё же пробрался текстовый мусор. Он находится между i1 (маркер_1) и i2 (маркер_2):

Логика была такая:
Маркер_1 - это цифры (771001001), они постоянные и всегда есть, как и Маркер_2 - "Уважаем" (см. скрин)

Код:
Шпинчевскому В.В.
ул. Винницкая,

д. №, кв. №,

г. Москва, 119192



на № от

О строительстве УДС -
23 мкр. Раменки

Есть какая-либо возможность убрать этот мусор? нужен только почтовый адрес.
 

Вложения

  • help.jpg
    help.jpg
    48,2 КБ · Просмотры: 6

weamagic

Пользователь
Пользователь
Июл 11, 2020
141
13
18
Попробуй как-нибудь так (очень криво, конечно, но идея рабочая):

Python:
i=0
j=0
while i<len(txt):
    n=i
    if ord(txt[i])>47:
        if ord(txt[i+1])<58:
            j=j+1
        else:
            j=0
    if j==6:
        break
    i=i+1
itog_txt=txt[0:n+2]
print(itog_txt)

Просто пробегаешься по символам получившегося среза, проверяя, чтобы ASCII-коды принадлежали цифрам. Потом считаешь сколько цифр следуют одна за другой и делаешь срез, когда это количество достигает 6.
 
  • Мне нравится
Реакции: Lancellot

Lancellot

Новичок
Пользователь
Апр 30, 2020
22
4
3
и делаешь срез, когда это количество достигает 6.
Да, всё получается. Но есть новая проблема))
Иногда почтовый индекс не на последнем месте стоит.

Сейчас так: г. Москва, 119192
Но бывает и так: 141500, Солнечногорск
 
  • Мне нравится
Реакции: Student

Lancellot

Новичок
Пользователь
Апр 30, 2020
22
4
3
Буду тестить.
 

Lancellot

Новичок
Пользователь
Апр 30, 2020
22
4
3
Как вариант пробую выдёргивать значения путём регулярных выражений.
Но ловлю ошибку:
Код:
AttributeError: 'str' object has no attribute 'str'

Скрипт:
Python:
from PIL import Image
import pytesseract
import string
import re


pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files (x86)\Tesseract-OCR\tesseract.exe'
im = Image.open("Screens/test2.jpg")
text = pytesseract.image_to_string(im, lang = 'rus')


i1 = text.index('771001001')
l1 = len('771001001')
i2 = text.index('Уважаем')

text = text[i1 + l1: i2].strip()

zip_code = text.str.extract(r'\b(\d{6})\b')
print(zip_code)

Или же str.extract не работает с переменными типа string?

АПДЕЙТ:

решил так:
Python:
zip_code =  re.findall(r"\b(\d{6})\b", text)
 
Последнее редактирование:

Форум IT Специалистов