如果 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"]
我正在编写一个脚本来获取扫描的 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"]