написание гибких регулярных выражений - PullRequest
1 голос
/ 25 мая 2020

Я пытаюсь написать программу, которая считывает текст со снимков экрана, а затем определяет по нему различные PII. Используя pytesseract для чтения текста, я пытаюсь написать регулярное выражение для URL-адресов, идентификаторов электронной почты и c. Вот пример функции, которая принимает строку и возвращает True идентификаторы электронной почты и 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))

Эта функция хорошо работает для всех идентификаторов электронной почты в правильном формате (abc@xyz.dd ), но поскольку входом в функцию является текст, считанный из pytesseract, не гарантируется, что текст будет правильно отформатирован. Моя функция возвращает False для abc@xyzdd. У меня те же проблемы с регулярным выражением URL, регулярным выражением доменного имени и т. Д. c. Есть ли способ сделать мои выражения регулярных выражений более устойчивыми к чтению ошибок из 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)

1 Ответ

0 голосов
/ 25 мая 2020

Возможно добавление некоторых флагов, таких как ignorecase и DOTALL для новой строки:

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

Соответствие URL:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...