python如何在很长的字符串中检测短语?

时间:2018-10-13 16:32:26

标签: python list detect

我正在尝试从纸质对账单(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 :(得分:1)

只需选择子字符串:if word[position+1:position+6]=='mount':

但是更好:直接if word[position:position+6]=='Amount':

答案 1 :(得分:0)

这是正则表达式的完美案例:

import re
match = re.search(r"Amount: \$(\d+)", huge_text)
if match:
    amount = match.group(1)

答案 2 :(得分:0)

这在很多层面上都是错误的,而且您为此憎恶付出了很多努力...

您应该考虑使用find()方法,该方法返回字符串中给定参数的起始索引。

您可以使用类似

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

在这种情况下。

答案 3 :(得分:0)

您可以使用内置的find字符串方法。要找到第一个匹配项:

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)

在这种情况下,您总是从最后找到的索引开始新的搜索。但是,如果要查找金额,则应考虑regular expressions

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]

最后一步只是将匹配项转换为数字。