re.findall带负数,我的代码仅适用于正数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了re.findall带负数,我的代码仅适用于正数相关的知识,希望对你有一定的参考价值。

我正在尝试使用OpenCV从屏幕上的程序获取号码。我在屏幕上具有该值所在的确切位置,并且能够使用图像进行文本识别将实时更新的图像转换为文本。我得到的文本是一个字符串,如下所示(利润:12.34,无论当时是什么)由于某种原因,我无法仅获取数字,因此我正在使用re.findall获取字符串中的数字。只要值> = 0,它就像一个该死的东西。我得到一个浮点数的返回值。完美的作品。但第二个数字为负,我得到此错误消息

  File "C:/Users/austi/.spyder-py3/OpenCV_Files/Closest_workingCV.py", line 55, in <module>
    price = re.findall("\d+", text)[0]

IndexError: list index out of range

到目前为止是我的代码



import numpy as np
from PIL import ImageGrab
import cv2
import time
import pytesseract
import re



pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"

while True:
    def process_img(original_image):
        processed_img = cv2.cvtColor(original_image, cv2.COLOR_BGR2GRAY)
        return processed_img

    def process_img1(original_image1):
        processed_img1 = cv2.cvtColor(original_image1, cv2.COLOR_BGR2GRAY)
        processed_img1 = cv2.Canny(processed_img1, threshold1=200, threshold2=300)
        return processed_img1


    coor1 = (20, 150, 950, 950)
    coor2 = (60, 550, 250, 590)
#    coor3 = (20, 150, 950, 950)


    #last_time = time.time()
    for i in range(2):
        if i == 0:
            x = coor1
            screen = np.array(ImageGrab.grab(bbox=(x)))
            new_screen = process_img(screen)
            #screen('Loop took  seconds'.format(time.time()-last_time))
            #last_time = time.time() 
            cv2.imshow('window', new_screen)  
            if cv2.waitKey(25) & 0xFF == ord('q'):
                cv2.destroyAllWindows()
                break
        elif  i == 1:
            x = coor2
            screen1 = np.array(ImageGrab.grab(bbox=(x)))
            new_screen1 = process_img(screen1)
            cv2.imshow('window1', new_screen1)   
            text = pytesseract.image_to_string(new_screen1)
            #price = text.split(":")[1]
            price = re.findall("\d+", text)[0]
            #rint(repr(text))
            #price = re.findall("\d+","Foo -111 Bar 55", text)
            price = float(price)
            #text = [float(s) for s in re.findall(r'-?\d+\.?\d*', text)]
            #print(text)
            print(price)
            if cv2.waitKey(25) & 0xFF == ord('q'):
                cv2.destroyAllWindows()
                break         

就像我说的那样,只要它不是负数,它就可以每秒完美地多次更新该数字。有人对如何解决此问题有任何建议吗?或其他更好的方法来达到我的最终目标。我已经搜索并发现了类似的问题,但是当我执行发现的所有拟议解决方案时,要么解决不了任何数字问题,要么我遇到的问题只是数字0或更大。不知道该怎么办,请帮忙。我包括了代码正在查看的屏幕片段谢谢enter image description here

答案

我认为正则表达式本身不是问题,只是可以扩展它以捕获负号。我对您的代码进行了重新处理以处理错误情况:

        screen1 = np.array(ImageGrab.grab(bbox=(x)))
        new_screen1 = process_img(screen1)
        cv2.imshow('window1', new_screen1)   
        text = pytesseract.image_to_string(new_screen1)

        if text:
            # test code to show the text to scan     
            print("text to scan:", repr(text))
            try:
                price = re.findall("-?\d+", text)[0]
                print(price)
                if cv2.waitKey(25) & 0xFF == ord('q'):
                    cv2.destroyAllWindows()
                    break
                else:
                    pass
            except IndexError:
                print("No price found")
        else:
            print("No text to scan")

以上是关于re.findall带负数,我的代码仅适用于正数的主要内容,如果未能解决你的问题,请参考以下文章

Excel 中的 IFS 公式:公式将分类正数但不分类负数

负数和正数的绝对值

如何使用maskRe限制ExtJs Textfield仅接受数字。 (应接受正数,负数,整数和十进制数。)

python:非正则表达式等价于 re.findall

D3线图显示正数和负数

在目标 c 中对负数和正数进行排序