如果re.findall未找到匹配项,如何返回字符串

时间:2019-07-02 15:18:38

标签: python regex string-search

我正在编写一个脚本,以获取扫描的pdf文件并将其转换为文本行以输入数据库。我使用re.findall从正则表达式列表中获取匹配项,以从tesseract提取的字符串中获取某些值。当正则表达式找不到匹配项时,我遇到麻烦,我希望它返回“错误”。所以我可以看到有问题。

我已经尝试了一些if / else语句,但是我似乎无法注意到None值。

from wand.image import Image as Img
import ghostscript
from PIL import Image
import pytesseract
import re
import os

def get_text_from_pdf(pendingpdf,pendingimg):
    with Img(filename=pendingpdf, resolution=300) as img:
        img.compression_quality = 99
        img.save(filename=pendingimg)
    pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract'
    extractedtext = pytesseract.image_to_string(Image.open(pendingimg))
    os.unlink(pendingimg)
    return extractedtext

def get_results(vendor,extracted_string,results):
    for v in vendor:
        pattern = re.compile(v)
        for match in re.findall(pattern,extracted_string):
            if type(match) is str:
                results.append(match)
            else:
                results.append("Error")
    return results

pendingpdf = r'J:\TBHscan07022019090315001.pdf'
pendingimg = 'Test1.jpg'
aggind = ["^(\w+)(?:.+)\n+3600",
          "Ticket: (nonsensewordstothrowerror)",
          "Ticket: \d+\s([0-9|/]+)",
          "Product: (\w+.+)\n",
          "Quantity: ([\d\.]+)",
          "Truck (\w+)"]
vendor = aggind
extracted_string = get_text_from_pdf(pendingpdf,pendingimg)
results = []

print(get_results(vendor,get_text_from_pdf(pendingpdf,pendingimg),results))

4 个答案:

答案 0 :(得分:1)

采用这种方法for match in re.findall(pattern,extracted_string):
如果re.findall(...)找不到任何匹配项-for循环不会甚至运行。

事先将匹配结果保存到变量中,然后-检查条件:

...
matches = re.findall(pattern, extracted_string)
if not matches:
    results.append("Error")
else:
    for match in matches:
        results.append(match)

请注意,当遍历re.findall(...)的结果时,支票if type(match) is str:毫无意义,因为每个匹配项都是 string (否则,对-可能暗含了字符串的内容。)

答案 1 :(得分:1)

re.findall在没有匹配项时返回一个空列表。所以应该很简单:

result = re.findall(my_pattern, my_text)
if result:
    # Successful logic here
else:
    return "Error"

答案 2 :(得分:0)

你有

for match in re.findall(pattern,extracted_string):
        if type(match) is str:
            results.append(match)
        else:
            results.append("Error")

但是re.findall()在找不到任何内容时会返回None,所以

for match in re.findall(pattern,extracted_string):

因为匹配为None,所以不会输入。

您需要在match is None循环之外检查for

答案 3 :(得分:0)

您可以在一行中完成此操作:

results += re.findall(pattern, extracted_string) or ["Error"]

顺便说一句,在供应商循环中编译模式不会有任何好处,因为您只使用了一次。

您的函数还可以使用单个列表理解来返回整个搜索结果:

return [m for v in vendor for m in re.findall(v, extracted_string) or ["Error"]]

您实际上想要修改并返回作为参数传递的结果列表有点奇怪。使用该功能时,可能会产生一些意想不到的副作用。

您的“错误”标志可能会在结果列表中多次出现,并且鉴于每个模式都可能返回多个匹配项,因此很难确定哪个模式未能找到值。

如果您只想在没有任何供应商模式匹配时发出错误信号,则可以对整个结果使用or ["Error"]技巧:

return [m for v in vendor for m in re.findall(v, extracted_string)] or ["Error"]