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

Python 如果re.findall找不到匹配项,如何返回字符串,python,regex,string-search,Python,Regex,String Search,我正在写一个脚本,将扫描的pdf文件转换成文本行,输入数据库。我使用re.findall从正则表达式列表中获取匹配项,以从tesseract提取的字符串中获取某些值。当正则表达式找不到匹配项时,我遇到了问题,我希望它返回“Error”。这样我就可以看出有问题了 我尝试了一些if/else语句,但似乎没有注意到None值 from wand.image import Image as Img import ghostscript from PIL import Image import pytes

我正在写一个脚本,将扫描的pdf文件转换成文本行,输入数据库。我使用re.findall从正则表达式列表中获取匹配项,以从tesseract提取的字符串中获取某些值。当正则表达式找不到匹配项时,我遇到了问题,我希望它返回“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))

对于re.findall(模式,提取的字符串)中的匹配,使用这种方法:
如果
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(…)
的结果时,如果类型(匹配)为str:则检查
没有意义,因为每个匹配项都是字符串(否则-可能会暗示对字符串内容进行更复杂的分析)。

re.findall
在没有匹配项时返回空列表。因此,它应该简单到:

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()
在找不到任何内容时返回
None
,所以

for match in re.findall(pattern,extracted_string):
不会输入,因为匹配项为
None


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

您可以在一行中执行此操作:

results += re.findall(pattern, extracted_string) or ["Error"]
顺便说一句,在vendor循环中编译模式并没有什么好处,因为您只使用了一次

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

return [m for v in vendor for m in re.findall(v, extracted_string) or ["Error"]]
有点奇怪的是,您实际上想要修改并返回作为参数传递的结果列表。使用该函数时,这可能会产生一些意外的副作用

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

如果您只想在所有供应商模式都不匹配时发出错误信号,则可以对整个结果使用
或[“error”]
技巧:

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

我必须回去看看,但没有找到所有只返回的匹配项?您是否尝试过使用
try-except
block?@saharudra是正确的。它比
if else
更像python,但OP仍然需要知道何时抛出异常。不需要
try except
块,
re.findall
在没有匹配项时不会抛出异常。这个答案比我的答案更彻底,也更正确。这非常有效。我基本上是想扫描一大堆交货凭证,然后把它们输入我们的应付账款系统。这基本上是一个电子表格。无论如何,非常感谢你!