1

我想用以下条件匹配一个字符串:

  • 匹配任何字母,后跟“.”,然后是字母,然后是行尾。

例如,对于字符串“www.stackoverflow.com”,正则表达式应返回“stackoverflow.com”。我有以下有效的代码:

my_string = '''
    123.domain.com
    123.456.domain.com
    domain.com
    '''

>>> for i in my_string.split():
...     re.findall('[A-Za-z\.]*?([A-Za-z]+\.[a-z]+)$', i)
...
['domain.com']
['domain.com']
['domain.com']
>>>

上面的代码片段完美运行。但我确信必须有一种更优雅的方式来实现同样的目标。

是否可以从字符串的末尾开始正则表达式搜索/匹配,向字符串的开头移动?如何编码那种类型的正则表达式?还是我应该使用正则表达式?

4

2 回答 2

1

从您的示例中,我不确定您是否只是想获取域名的最后两部分,或者您是否想删除这些数字。如果您只想要域的最后部分,您可以执行以下操作:

for i in my_string.split():
     '.'.join(i.split('.')[-2:])

这:

  1. 将每个字符串拆分成一个单词列表,将 '.' 拆分到哪里 原本是,然后
  2. 将最后两个单词组合成一个字符串,并带有一个 '.' 分隔器。

或者,像这样:

>>> my_string = ['123.domain.com', '123.456.domain.com', 'domain.com', 'www.stackoverflow.com']
>>> ['.'.join(i.split('.')[-2:]) for i in my_string]
['domain.com', 'domain.com', 'domain.com', 'stackoverflow.com']
于 2013-06-05T16:48:14.553 回答
1

您的正则表达式不会考虑类似的域domain.co.uk,所以我会考虑使用更强大的东西。如果您不介意在脚本中添加更多依赖项,那么有一个名为tldextract( pip install tldextract) 的模块可以让这变得非常简单:

import tldextract

def get_domain(url):
    result = tldextract.extract(url)

    return result.domain + '.' + result.tld
于 2013-06-05T16:48:39.067 回答