RegEx для извлечения доменов и поддоменов - PullRequest
1 голос
/ 16 мая 2019

Я пытаюсь свести кучу веб-сайтов к своим доменным именам, т. Е.

https://www.facebook.org/hello 

становится facebook.org.

Я использую поиск шаблонов регулярных выражений:

(https?:\/\/)?([wW]{3}\.)?([\w]*.\w*)([\/\w]*)

Это ловит большинство случаев, но иногда появляются такие сайты, как:

http://www.xxxx.wordpress.com/hello

который я хочу раздеть до xxxx.wordpress.com.

Как я могу идентифицировать эти случаи, в то же время идентифицируя все остальные обычные записи?

Ответы [ 2 ]

1 голос
/ 16 мая 2019

Ваше выражение, кажется, работает отлично и выводит то, что вы, возможно, захотите.Я только добавил флаг i и немного изменил его на:

(https?:\/\/)?([w]{3}\.)?(\w*.\w*)([\/\w]*)

RegEx

Если это не было вашим желаемым выражением, вы можете изменить / изменить свои выражения в regex101.com .

enter image description here

RegEx Circuit

Вы также можете визуализировать свои выражения в jex.im :

enter image description here

Код Python

# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility

import re

regex = r"(https?:\/\/)?([w]{3}\.)?(\w*.\w*)([\/\w]*)"

test_str = ("https://www.facebook.org/hello\n"
    "http://www.xxxx.wordpress.com/hello\n"
    "http://www.xxxx.yyy.zzz.wordpress.com/hello")

subst = "\\3"

# You can manually specify the number of replacements by changing the 4th argument
result = re.sub(regex, subst, test_str, 0, re.MULTILINE | re.IGNORECASE)

if result:
    print (result)

# Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.

Демонстрация JavaScript

const regex = /(https?:\/\/)?([w]{3}\.)?(\w*.\w*)([\/\w]*)/gmi;
const str = `https://www.facebook.org/hello
http://www.xxxx.wordpress.com/hello
http://www.xxxx.yyy.zzz.wordpress.com/hello`;
const subst = `$3`;

// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);

console.log('Substitution result: ', result);
1 голос
/ 16 мая 2019

Хотя Роберт Харви предложил полезный метод urllib.parse, вот моя попытка регулярного выражения:

(?:http[s]?:\/\/)?(?:www\.)?([^/\n\r\s]+\.[^/\n\r\s]+)(?:/)?(\w+)?

Как видно на regex101.com

Пояснение -

Сначала регулярное выражение проверяет, есть ли https:// или http://.Если это так, он игнорирует его, но начинает поиск после этого.

Затем регулярное выражение проверяет наличие www.. Важно отметить, что это не является обязательным, поэтому, если пользователь вводит my website is site.com, site.com будет сопоставлено.

[^/\n\r\s]+\.[^/\n\r\s]+ соответствует фактическому URL, который вам нужен, поэтому в нем не будет пробелов или переносов.Да, и там должен быть хотя бы один период (.).

Поскольку ваш вопрос выглядит так, как будто вы также хотите соответствовать подкаталогу, я добавил (\w+)? в конце.

TL; DR

Группа 0 - полный URL

Группа 1 - доменное имя

Группа 2 - подкаталог

...