- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
import re, copy, json
config = {}
def domain_mapper(domain):
def injector(f):
if domain not in config:
config[domain] = []
config[domain].append(f)
return injector
def default(f):
config['default'] = [f]
return f
@domain_mapper("gmail.com")
@default
def google_filter(content):
regex = r"([^\!\?\.]*?offer.*?[\!\?\.])"
repl = r""
return re.sub(regex, repl, content, re.M)
@domain_mapper("gmail.com")
def another_google_filter(content):
return content
@domain_mapper("yandex.ru")
def yandex_filter(content):
regex = r"<img src=[\"'](.+?)[\"'].*/>"
repl = r"\1"
return re.sub(regex, repl, content, re.M)
@domain_mapper("mail.ru")
def mail_filter(content):
regex = r"<img src=[\"'](.+?)\.gif[\"'].*/>"
repl = r"<img src='\1.png'/>"
return re.sub(regex, repl, content, re.M)
def __init__(self, email, message):
self.email = email
self.message = message
def send(self):
for fltr in self.find_filter():
self.message = fltr(self.message)
return self
def find_filter(self):
fltr = None
matches = re.match(r"[0-9a-zA-Z\.]+@([a-z]+\.[a-z]+)", self.email)
if not matches: raise Exception("Invalid email addr")
domain = matches.group(1)
# 'default' домен не пройдет re.match
if domain not in config: return config['default']
return config[domain]
def __str__(self):
return json.dumps(self.__dict__)
def __repr__(self):
return str(self)
ну такое
http://emailregex.com/
RFC учитывает всякие устаревшие форматы, включая возможность отправить e-mail на IP-адрес (domain-literal в RFC), а ещё адрес в уголковых скобках (angle-addr), экранирование символов в local-part. Плюс ещё разные реализации ссылаются на разные версии RFC (822, 2822, 5322).
Отбросим поддержку UUCP (цепочка маршрутизаторов почты через !), angle-addr ("Vasiliy Pupkin" <[email protected]>), отправку на айпишник (vasya-pupkin@[169.254.1.1]). Тогда адрес должен содержать ровно один символ @, которым он делится на локальную часть и доменную часть.
В локальной части нельзя использовать непечатаемые символы (с кодами 0x00-0x20 и 0x7F), кавычки, запятую, точку с запятой и какие-то скобочки. Всё остальное можно разрешить. Кстати, сервер вправе учитывать регистр, поэтому приводить локальную часть к нижнему регистру не надо. Хотя «Граватар» и большинство форумов всё-таки приводят, чтобы затруднить мультоводство (популярные почтовые системы регистр не учитывают).
Доменная часть должна подчиняться стандартам DNS: разрешены латинские буквы, цифры, минусы и точки. Домен может быть любого уровня, а не только второго. Регистр в доменной части игнорируется.
Остаётся открытым вопрос о символах за пределами ASCII. В доменной части они могут быть закодированы в Punycode (xn--p1ai, например), а могут быть и не закодированы. Ограничения же локальной части нужно смотреть в RFC.
Закидайте меня какашками, если что-то наврал.
Но я бы сделал просто .*@.+ и ниипет.
Только потом при использовании (если на него нужно что-то отправлять) придётся проверить, чтобы никакой символ не сыграл роль разделителя. Ну, например, адрес вставляется в поле To:, а там запятая служит разделителем элементов списка.
Тут, наверное, достаточно защиты от откровенно неподходящих вариантов, типа "", "ул. Ленина д 12", "ааа", "Иванов", "vk.com/ivanof69"...
Хороший сервис должен сам сконвертировать домен в Punycode, если требуется.
http://emailregex.com/wp-content/uploads/sites/2/2014/06/General-Email-Regex-Railroad-Diagram-emailregex.com_.png
Но не осилили написать по ней регулярку.
годная рега там только для перла
Кстати, о камеруне. Как там с погодой?
Неправда, как минимум я так не говорю, зато видал как старперы за 30 так говорят.
Похоже, что алгоритм сделали более вореционным. Совсем пользователей за дебилов считают.
Хелпа у них не нашёл. Вместо хелпа у этих петухов 100500 страниц с рекламой «приватности».
https://www.php.net/manual/ru/reference.pcre.pattern.modifiers.php
Если есть на свете ад для программистов, то они там день-деньской парсят произвольный HTML регулярками
сегодня поменяется, гарантия - завтра
Парсить HTML вручную имеет смысл, только если для библиотеки XML не хватает памяти или если файл испорчен (недокачан, незакрытые теги — вот это всё). Да и в этом случае лучше не регуляркой, а пройти простым циклом.
> import re
Говно.
Импорты через запятую, между функциями одна строка, индентация табами — читать PEP8, быстро, решительно!