如何使用 python 正则表达式删除忽略 www.并且只给域名?

How to use python regex to remove ignore www. and only give the domain name?

我正在尝试创建一个正则表达式过滤器,用于清理由 python 脚本处理的域。

域名可能只是普通域名

或者可以有一个url结构

或者可以有 url 结构与 www

我目前有一个粗略的正则表达式来从这些结构中提取域,除了我还没有想出一种方法来过滤掉 www.出。

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

这个正则表达式在从 url 中抓取域方面做得不错,但是当我尝试进行任何类型的负面前瞻以删除 www. 时,我似乎无法获得所需的结果。我试过 (?!www.) 只带走了一个 w 而不是全部 3 和.,任何解决这个问题的帮助将不胜感激。

使用urlparse。以下是使用它的示例。我发现使用 urlparseregex 更容易。 urlparse 给你一个 class 的解析结果,我们可以选择提取我们想要的项目,然后进行所需的逻辑操作来提取所需的主机。

>>> from urlparse import urlparse
>>> u1 = "https://example.com"
>>> d1 = urlparse(u1)
>>> d1.hostname
'example.com'

>>> u2 = 'https://www.123.com'
>>> h = urlparse(u2)
>>> host = h.hostname
>>> host[4:]
'123.com'

>>> u3 = 'something.com'
>>> d3 = urlparse(u3)
>>> if bool(d3.netloc):
...     print(d3)
... else:
...     print d3.path
... 
something.com

>>> d4 = 'somenew.net/pathis/123'
>>> u4 = urlparse(d4)
'somenew.net/pathis/123'
>>> u4.path.split('/')[0]
'somenew.net'

除非你绝对必须使用正则表达式,否则最好使用为此设计的东西——比如内置的 urlparse。一方面,您的正则表达式(以及评论中链接的正则表达式)不会匹配具有非 ASCII 字符的域。

>>> from urlparse import urlparse # Python 2
>>> # from urllib.parse import urlparse # Python 3

>>> urlparse('http://www.some.domain/the/path')
ParseResult(scheme='http', netloc='www.some.domain', path='/the/path', params='', query='', fragment='')
>>> urlparse('http://www.some.domain/the/path').netloc
'www.some.domain'

请注意,您可能想要检测没有 scheme 的字符串并添加它:

>>> url = 'www.other.domain'
>>> urlparse(url)
ParseResult(scheme='', netloc='', path='www.other.domain', params='', query='', fragment='')
>>> if not urlparse(url).scheme:
...     print urlparse('http://' + url)
ParseResult(scheme='http', netloc='www.other.domain', path='', params='', query='', fragment='')

所以您总是在 ParseResultnetloc 属性中获取域。

分离出域后,如果您想删除 'www.',有许多简单的方法可以做到。

尝试

((?:[a-z][a-z0-9-]*[a-z0-9]\.|[a-z]\.)(?<!\bwww\.)
 (?:[a-z][a-z0-9-]*[a-z0-9]\.|[a-z]\.)*
 (?:[a-z][a-z0-9-]*[a-z0-9]|[a-z]))

examples

解释:

  • [a-z][a-z0-9-]*[a-z0-9]\.|[a-z]\. 匹配 RFC 1034
  • 描述的标签
  • (?<!\bwww\.) 断言域不以 www. 开头。第一行(?:[a-z][a-z0-9-]*[a-z0-9]\.|[a-z]\.)匹配的部分。

要同时匹配最简单的 URL 方案(无 auth 部分),请使用 this:

https?://
(?:www\.)?
((?:[a-z][a-z0-9-]*[a-z0-9]\.|[a-z]\.)+
 (?:[a-z][a-z0-9-]*[a-z0-9]|[a-z]))

请注意,re.VERBOSE 用于忽略模式中的空格,因此它看起来更具可读性。

试试下面

import re
from urllib.parse import urlparse



def parse_url(url):
    url_parse=urlparse(url)
    if not url_parse.scheme:
        url='http://' + url
        url_parse=urlparse(url)
    domain=urlparse(url).netloc
    domain = re.sub(r"^www.", "", domain)
    return(domain)

url='https://www.facebuk.com'
print(parse_url(url))
>>> facebuk.com

url='www.facebuk.com'
print(parse_url(url))
>>> facebuk.com