【问题标题】:Extract domain name from URL using python's re regex使用 python 的 re 正则表达式从 URL 中提取域名
【发布时间】:2019-04-26 06:34:18
【问题描述】:

我想输入一个 URL 并提取域名,它是 http:// 或 https:// 之后的字符串,包含字符串、数字、点、下划线或破折号。

我写了正则表达式并使用了python的re模块如下:

import re
m = re.search('https?://([A-Za-z_0-9.-]+).*', 'https://google.co.uk?link=something')
m.group(1)
print(m)

我的理解是m.group(1)会提取re.search中()之间的部分。

我期望的输出是:google.co.uk 但我得到了这个:

<_sre.SRE_Match object; span=(0, 35), match='https://google.co.uk?link=something'>

你能指点我如何使用re来实现我的要求吗?

【问题讨论】:

    标签: python regex python-3.x


    【解决方案1】:

    你需要写

    print(m.group(1))
    

    更好的是 - 之前有条件:

    m = re.search('https?://([A-Za-z_0-9.-]+).*', 'https://google.co.uk?link=something')
    if m:
        print(m.group(1))
    

    【讨论】:

      【解决方案2】:

      Jan 已经为此提供了解决方案。但请注意,我们可以在不使用re 的情况下实现相同的功能。它所需要的只是!"#$%&amp;\'()*+,-./:;&lt;=&gt;?@[\\]^_`{|}~ 用于验证目的。同样可以从string包中获得。

      def domain_finder(link):
          import string
          dot_splitter = link.split('.')
      
          seperator_first = 0
          if '//' in dot_splitter[0]:
              seperator_first = (dot_splitter[0].find('//') + 2)
      
          seperator_end = ''
          for i in dot_splitter[2]:
              if i in string.punctuation:
                  seperator_end = i
                  break
      
          if seperator_end:
              end_ = dot_splitter[2].split(seperator_end)[0]
          else:
              end_ = dot_splitter[2]
      
          domain = [dot_splitter[0][seperator_first:], dot_splitter[1], end_]
          domain = '.'.join(domain)
      
          return domain
      
      link = 'https://google.co.uk?link=something'
      domain = domain_finder(link=link)
      print(domain) # prints ==> 'google.co.uk'
      

      这只是在没有re 的情况下解决相同问题的另一种方法。

      【讨论】:

        【解决方案3】:

        有一个名为 tldextract 的库在这种情况下非常可靠。

        下面是它的工作原理

        import tldextract
        
        def extractDomain(url):
            if "http" in str(url) or "www" in str(url):
                parsed = tldextract.extract(url)
                parsed = ".".join([i for i in parsed if i])
                return parsed
            else: return "NA"
        
        op = open("out.txt",'w')
        # with open("test.txt") as ptr:
        #   for lines in ptr.read().split("\n"):
        #       op.write(str(extractDomain(lines)) + "\n")
        
        print(extractDomain("https://test.pythonhosted.org/Flask-Mail/"))
        

        输出如下,

        test.pythonhosted.org
        

        【讨论】:

        • 但我需要子域顺便说一句。我认为第一个更可靠。这个库依赖于硬编码列表。所以这取决于列表的更新程度。
        • 是的,两者都提供了良好的结果。在我的用例中,我必须单独获取域名,这对我有很大帮助。还对 10K 不同的 url 进行了一些测试,它们都可以正常工作
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-04
        • 1970-01-01
        • 1970-01-01
        • 2018-08-21
        • 1970-01-01
        相关资源
        最近更新 更多