Почему обработка моего регулярного выражения Python занимает так много времени? - PullRequest
1 голос
/ 28 мая 2020

Я делаю программу Python, которая сопоставляет все электронные письма в строке и возвращает их пользователю:

emailRegex = re.compile(r'((.*)+@(.*)+\.(.*){3})')
text = "John Smith, Vice Provost for Undergraduate Studies\n123-456-7890\njohn.smith@email.edu"
emailList = emailRegex.findall(text)
clipOut = []
for tup in emailList:
     clipOut.append(tup[0])
print(clipOut)

Я запускал эту программу более 9 минут без какого-либо вывода

Как ни странно, изменение текстовой строки на "John\n123-456-7890\njohn.smith@email.edu" приводит к тому, что регулярное выражение почти мгновенно соответствует. Строка John Smith, Vice Provost\n123-456-7890\njohn.smith@email.edu запускается на моем ноутбуке чуть более 10 секунд. Уменьшение количества символов перед электронным письмом увеличивает скорость сопоставления. Изменение используемых символов не увеличивает скорость сопоставления. Однако удаление всех новых строк заставляет программу работать с ожидаемой скоростью, независимо от количества символов перед электронной почтой.

Наконец, изменение регулярного выражения на:

emailRegex = re.compile(r'([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+(\.[a-zA-Z]{2,4}))')

Обеспечивает нормальную работу программы, независимо от длины строки.

Я понимаю, что мое регулярное выражение было некорректным, но я не понимаю, почему из-за этого моя программа так долго запускается

1 Ответ

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

Вероятно, ошибка была вызвана + после (.*). Изменение регулярного выражения на emailRegex = re.compile(r'((.+)@(.+)\.(.){2,4})') заставляет программу работать должным образом. Спасибо за помощь!

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