如果 re.findall 找不到匹配项,如何 return 字符串

How to return a string if a re.findall finds no match

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

我尝试了一些 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))

有了这样的方法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(否则 -可能暗示对字符串内容进行更复杂的分析。

re.findall returns 没有匹配项时为空列表。所以它应该很简单:

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

你有

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

但是 re.findall() returns None 当它找不到任何东西时,所以

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

不会进入,因为匹配项是 None

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

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

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

顺便说一句,在供应商循环内编译模式对您没有任何好处,因为您只使用它一次。

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

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

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

您的 "Error" 标志可能会在结果列表中出现多次,并且鉴于每个模式可能 return 多次匹配,因此很难确定哪个模式找不到值。

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

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