Regex получает доменное имя от электронной почты

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

строка

[email protected]

Я просто хочу получить Google, а не Google.com

Regex:

[^@].+(?=\.)

Результат: https://regex101.com/r/wA5eX5/1

Из моего понимания. Это игнорирует @ найти строку после этого, пока . (точка), используя (?=\.)

Что я сделал не так?

Ответ 1

[^@] означает "соответствовать одному символу, который не является знаком @. Это не то, что вы ищете - используйте lookbehind (?<[email protected]) для @ и ваш (?=\.) lookahead для \. чтобы извлечь сервер имя в середине:

(?<[email protected])[^.]+(?=\.)

Средняя часть [^.]+ Означает "один или несколько символов без точек".

Demo.

Ответ 2

Обновленный ответ:
Используйте группу захвата и держите это простым :)

@(\w+)

Объяснение, разделив его
( группа захвата для извлечения )
\w обозначает символ слова [A-Za-z0-9_]
+ является квантификатором для одного или нескольких вхождений \w

Regex объяснение и демонстрация на Regex101

Ответ 3

Я использовал решение regex для своей задачи, но понял, что некоторые из этих писем не так легки: [email protected], [email protected] и [email protected]

Для тех, кто пришел сюда, желая поддомену (или обрезается им), здесь регулярное выражение:

(?<[email protected])[^.]*.[^.]*(?=\.)

Ответ 4

Это должно быть регулярное выражение:

(?<[email protected])[^.]+

(?<[email protected]) - помещает поиск сразу после @ [^.]+ - взять все символы, которые не являются точками (останавливается на точке)

Итак, он извлекает google из адреса электронной почты.

Ответ 5

Может быть, не строго "полный регулярный запрос", но более гибкий (в случае, если часть до @не "first.last" ) будет использовать cut:

cut -d @ -f 2 | cut -d . -f 1 

Первый разрез будет изолировать часть после @, а вторая - получить то, что вы хотите. Это будет работать и для других типов шаблонов электронной почты: [email protected]/xxx.yyy.zzz @server.com и т.д.

Ответ 6

Это относительно простое регулярное выражение, и оно захватывает все между @ и окончательным расширением домена (например,.com,.org). Это позволяет доменные имена, которые состоят из несловесных символов, которые существуют в реальных данных.

>>> regex = re.compile(r"^[email protected](.+)\.[\w]+$")

>>> regex.findall('[email protected]')
['my-bank']

>>> regex.findall('[email protected]')
['spam']

>>> regex.findall('[email protected]')
['sandnes.district']

Ответ 7

Поскольку я работал, чтобы получить доменное имя адресов электронной почты, и ни один не соответствовал тому, что мне было нужно:

  • Не ловить субдомены
  • Для сопоставления топовых доменов стран (например .com.ar или co.jp)

Например, в [email protected] мне нужно сопоставить domain.com.mx

Итак, я сделал это:

[^[email protected]]*?\.\w{2,}$|[^[email protected]]*?\.com?\.\w{2}$

Вот ссылка на regex101 для иллюстрации регулярного выражения: https://regex101.com/r/vE8rP9/59

Вы можете получить имя sumdomain (без домена верхнего уровня, например: .com или .com.mx), добавив операторы поиска (но оно будет совпадать дважды в [email protected]):

[^[email protected]]*?(?=\.\w{2,}$)|[^[email protected]]*?(?=\.com?\.\w{2}$)