RegEx用于提取域和子域

时间:2019-05-15 21:31:11

标签: python regex regex-lookarounds regex-group regex-greedy

我正在尝试将一堆网站剥离为域名,即:

https://www.facebook.org/hello 

成为facebook.org

我正在使用正则表达式模式查找器:

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

这可以捕获大多数情况,但是偶尔会有一些网站,例如:

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

我想剥离到xxxx.wordpress.com

如何在识别所有正常条目的同时识别这些情况?

3 个答案:

答案 0 :(得分:1)

尽管罗伯特·哈维(Robert Harvey)提出了一种有用的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]+匹配您所需的实际网址,因此不会包含空格或换行符。哦,那里必须至少有一个句点(.)。

由于您的问题看起来也想匹配子目录,因此我在末尾添加了(\w+)?

TL; DR

第0组-整个网址

第1组-域名

第2组-子目录

答案 1 :(得分:1)

您的表情似乎运行得很好,并且可以输出您想要的内容。我只添加了i标志,并将其稍作修改为:

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

RegEx

如果这不是您想要的表达式,则可以在regex101.com中修改/更改表达式。

enter image description here

RegEx电路

您还可以在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);

答案 2 :(得分:0)

print("-------------")

# 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]*)"
    regex1 = r"\.?(microsoft.com.*)"
    test_str = (
    "https://blog.microsoft.com/test.html\n"
    "https://www.blog.microsoft.com/test/test\n"
    "https://microsoft.com\n"
    "http://www.blog.xyz.abc.microsoft.com/test/test\n"
    "https://www.microsoft.com")
    
    subst = "\\3"
    if test_str:
        print (test_str)
    
    print ("-----")
    # 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)
    
    print ("-----")
    result = re.sub(regex1, "", result, 0, re.MULTILINE | re.IGNORECASE)
    if result:
        print (result)
    
    print ("-----")