如何使用 python 正则表达式删除忽略 www.并且只给域名?
How to use python regex to remove ignore www. and only give the domain name?
我正在尝试创建一个正则表达式过滤器,用于清理由 python 脚本处理的域。
域名可能只是普通域名
- something.com,一些.something.com
或者可以有一个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
。以下是使用它的示例。我发现使用 urlparse
比 regex
更容易。 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='')
所以您总是在 ParseResult
的 netloc
属性中获取域。
分离出域后,如果您想删除 '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]))
解释:
[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
我正在尝试创建一个正则表达式过滤器,用于清理由 python 脚本处理的域。
域名可能只是普通域名
- something.com,一些.something.com
或者可以有一个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
。以下是使用它的示例。我发现使用 urlparse
比 regex
更容易。 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='')
所以您总是在 ParseResult
的 netloc
属性中获取域。
分离出域后,如果您想删除 '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]))
解释:
[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