Как определить фразу в очень длинных строках? - PullRequest
0 голосов
/ 13 октября 2018

Я пытаюсь преобразовать числа из бумажных выписок (pytesseract) и импортировать их в Excel, например, можно найти сумму денег, переведенную путем определения «Суммы» в выписке:

"...... Сумма: $ 345 "

Я использую следующий код для определения ключевого слова:

for position,letter in enumerate(huge_text):
    if letter=='A':
        if word[position+1]=='m':
            if word[position+2]=='o':
                if word[position+3]=='u':
                    if word[position+4]=='n':
                        if word[position+5]=='t':
                            print('word[position+9]'+'word[position+10]'+'word[position+11])`

Это, очевидно, очень громоздко, также я не знаю длину числа, поэтомуЯ могу что-то упустить в процессе, есть идея получше?

Ответы [ 4 ]

0 голосов
/ 13 октября 2018

Вы можете использовать встроенный метод поиска строк.Для нахождения первого вхождения:

pos = huge_text.find('Amount')

Теперь pos равно -1, если Сумма не найдена, в противном случае ее индекс.Чтобы найти все вхождения, вы можете заключить его в цикл s while:

positions = []
p = 0
while p >= 0:
    p = huge_text.find('Amount', p+1)
    if p > 0:
        positions.append(p)

В этом случае вы всегда начинаете новый поиск с последнего найденного индекса.Но если вы хотите найти суммы, вам следует рассмотреть регулярные выражения :

import re

amounts = re.findall(r'Amount: ?\$(\d+.?\d?)', huge_text)

Объяснение: В скобках указан фактический шаблон, который мы хотим извлечь (\d+.?\d? указывает, что эточисло), первая часть (Amount: ?) содержит ключевое слово, которое вы ищете, за которым следует двоеточие и дополнительный пробел.Пример:

import re

huge_text = 'Lorem ipsum Amount: $345 dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Amount:$6351 Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu Amount: $9852 fugiat nulla pariatur.'

amounts = [float(x.strip()) for x in re.findall(r'Amount: ?\$(\d+.?\d?)', huge_text)]

# => [345.0, 6351.0, 9852.0]

Последний шаг просто преобразует совпадения в числа.

0 голосов
/ 13 октября 2018

Это идеальный случай для регулярного выражения:

import re
match = re.search(r"Amount: \$(\d+)", huge_text)
if match:
    amount = match.group(1)
0 голосов
/ 13 октября 2018

Это неправильно на многих уровнях, и усилия, которые вы вкладываете в эту мерзость ...

Вам следует рассмотреть возможность использования метода find(), который возвращает начальный индекс данного параметра внутри строки.

В этом случае вы можете использовать что-то вроде

if(line.find("Amount")):
    # do something

.

0 голосов
/ 13 октября 2018

Просто выберите подстроку: if word[position+1:position+6]=='mount':

Но лучше: if word[position:position+6]=='Amount': напрямую.

...