首页 > 解决方案 > 编写灵活的正则表达式

问题描述

我正在尝试编写一个程序,从屏幕截图中读取文本,然后从中识别各种 PII。使用 pytesseract 读取文本,我正在尝试为 url、电子邮件 ID 等编写正则表达式。下面是一个函数示例,它接收一个字符串并返回True电子邮件 ID,False否则:

def email_regex(text):
    pattern = compile(r"\A[a-z0-9!#$%&'*+/=?^_‘{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_‘{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?")
    return bool(pattern.match(text))

此函数适用于所有格式正确的电子邮件 ID(abc@xyz.dd),但由于该函数的输入是从 pytesseract 读取的文本,因此不能保证文本格式正确。我的函数返回False. abc@xyzdd我在 URL 正则表达式、域名正则表达式等方面遇到了同样的问题。有没有办法让我的正则表达式更健壮地从 pytesseract 读取错误?

我已经尝试遵循这个答案的公认解决方案,但这会导致正则表达式函数True也返回随机单词。任何解决此问题的帮助将不胜感激。

编辑:- 这是我的 url 和域正则表达式,在这里我遇到了与我的电子邮件正则表达式相同的问题。任何有关这些的帮助对我来说都非常有用。

    pattern = compile(r'\b(((([a-zA-Z0-9])|([a-zA-Z0-9][a-zA-Z0-9\-]{0,86} 
    [a-zA-Z0-9]))\.(([a-zA-Z0-9])|([a-zA-Z0-9][a-zA-Z0-9\-]{0,73}[a-zA-Z0-9]))\.(([a-zA-Z0-9]{2,12}\.[a-zA-Z0-9]{2,12})|([a-zA-Z0-9]{2,25})))|((([a-zA-Z0-9])|([a-zA-Z0-9][a-zA-Z0-9\-]{0,162}[a-zA-Z0-9]))\.(([a-zA-Z0-9]{2,12}\.[a-zA-Z0-9]{2,12})|([a-zA-Z0-9]{2,25}))))\b', re.IGNORECASE)
    return pattern.match(text)```


  def url_regex(text):
    pattern = compile(r'(http|https://)?:(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F])+)', re.IGNORECASE)
    return pattern.match(text)

标签: pythonregexpython-tesseract

解决方案


也许为换行添加一些标志,例如 ignorecase 和 DOTALL:

# Match email ID:
my_pattern = compile(r"^[a-z0-9]+[\._]?[a-z0-9]+[@]\w+[.]?\w{2,3}$", re.I, re.S)

匹配网址:

https://gist.github.com/gruber/8891611


推荐阅读