Python 如果re.findall找不到匹配项,如何返回字符串
我正在写一个脚本,将扫描的pdf文件转换成文本行,输入数据库。我使用re.findall从正则表达式列表中获取匹配项,以从tesseract提取的字符串中获取某些值。当正则表达式找不到匹配项时,我遇到了问题,我希望它返回“Error”。这样我就可以看出有问题了 我尝试了一些if/else语句,但似乎没有注意到None值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
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
在没有匹配项时不会抛出异常。这个答案比我的答案更彻底,也更正确。这非常有效。我基本上是想扫描一大堆交货凭证,然后把它们输入我们的应付账款系统。这基本上是一个电子表格。无论如何,非常感谢你!