Вы должны удалить \s?
из первого регулярного выражения (вам не нужны пробелы в начале матча) или заменить на (?<!\S)
, если вы хотите, чтобы совпадение было только после пробела или начала строки.
Настоящая проблема со вторым регулярным выражением, где .
находится в классе символов, который количественно определяется с помощью +
. \.
, который следует за ним, также соответствует .
, и это создает проблему, когда в строке не появляется соответствующий текст. Это катастрофический откат .
Поскольку совпадения, которые вы ожидаете, представляют собой целые слова, я предлагаю улучшить шаблон за счет 1) добавления границ слов, 2) приведения всех примыкающих подшаблонов к различным типам символов.
Используйте
r'\b[A-Za-z0-9._%+-]+@(?:[A-Za-z0-9-]+\.)+[A-Za-z]{2,4}\b'
для сопоставления электронных писем.
См. Часть (?:[A-Za-z0-9-]+\.)+
: она соответствует одному или нескольким повторениям, состоящим из 1 или более буквенно-цифровых символов / дефисов, за которыми следует точка, и после этого шаблона нет \.
, есть класс буквенных символов, поэтому следует не будь проблемой, как та, что была раньше.