使用Python正则表达式从文本中提取域名

3

我有以下正则表达式:

r'(?:[a-zA-Z0-9](?:[a-zA-Z0-9\-]{,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}'

当我将这个应用于一个文本字符串,比如说,“this is www.website1.com and this is website2.com”,我得到:

['www.website1.com']

['website.com']

如何修改正则表达式以排除'www',从而得到 'website1.com' 和 'website2.com'?我错过了一些非常基本的东西...

可能是从文本中提取所有域名的重复问题。 - tripleee
2个回答

4
尝试使用这个(感谢@SunDeep的更新):
\s(?:www.)?(\w+.com)

解释

\s 匹配任何空白字符

(?:www.)? 非捕获组,匹配 0 次或多次的 www.

(\w+.com) 匹配任何一个或多个单词字符,后跟 .com

实际应用:

import re

s = 'this is www.website1.com and this is website2.com'

matches = re.findall(r'\s(?:www.)?(\w+.com)', s)
print(matches)

输出:

['website1.com', 'website2.com']

关于这个问题,有几点需要注意。首先,匹配所有有效的域名非常困难,因此在本例中,我选择使用\w+进行捕获,但我也可以选择类似于[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]\.[a-zA-Z]{2,}的内容。

关于匹配域名,下面这个答案提供了很多有用的信息: What is a regular expression which will match a valid domain name without a subdomain?

其次,我只寻找.com域名,您可以调整我的正则表达式,例如:

\s(?:www.)?(\w+.(com|org|net))

为了匹配您所寻找的任何类型的域名。

0

这里是一个尝试:

import re
s = "www.website1.com"
k = re.findall ( '(www.)?(.*?)$', s, re.DOTALL)[0][1]
print(k)

输出结果如下:

'website1.com'

如果它是s =“ website1.com”,则输出如下:
'website1.com'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接