Python域名列表regex

2024-09-30 14:28:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望使用python获得给定字符串中的所有域名。 我试过下面的方法,但我没有得到预期的o/p

str = "ctcO6OgnWRAxLtu+akRCFwM asu.edu zOiV6Wo6nDnUhQkZO4XTySrTRwLMgozM9R/LyQs2r+Pb tarantino.cs.ucsb.edu,128.111.48.123 ssh-rsa 9SMF4U+qJW03Bh1"
list = re.findall(r'([a-zA-Z0-9]+(-[a-zA-Z0-9]+)*\.)+[a-z]{2,10}', str)
print list

我希望输出为:

^{pr2}$

但我得到的是:

[('asu.', ''), ('ucsb.', '')]

我错过了什么?在


Tags: 方法字符串list域名edupbstrza
2条回答
In [63]: text = "ctcO6OgnWRAxLtu+akRCFwM asu.edu zOiV6Wo6nDnUhQkZO4XTySrTRwLMgozM9R/LyQs2r+Pb tarantino.cs.ucsb.edu,128.111.48.123 ssh-rsa 9SMF4U+qJW03Bh1"

In [64]: re.findall(r'(?:[a-zA-Z0-9]+\.)+[a-z]{2,10}', text)
Out[64]: ['asu.edu', 'tarantino.cs.ucsb.edu']
  • 使用(?:...)创建非捕获组。当模式包含多个分组模式(即用括号括起来的模式)时,re.findall为每个匹配项返回一个元组。要防止re.findall返回元组列表,请使用非捕获组。

  • 对于您发布的text,模式{}是不必要的。在text中没有文字-,因此(-[a-zA-Z0-9]+)*从不匹配text中的任何内容。当然,如果您愿意,您可以将(?:-[a-zA-Z0-9]+)*添加到模式中(注意使用了非捕获组(?:...)),但是您发布的text并没有执行该部分模式。它可以让你把名字和海普思匹配起来,但是:

    ^{pr2}$

    作为Aprillion noted

    In [74]: re.findall(r'(?:[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*\.)+[a-z]{2,10}', text)
    Out[74]: ['asu.edu', 'tarantino.cs.ucsb.edu']
    
  • 请参见regex101以获得模式(?:[a-zA-Z0-9]+\.)+[a-z]{2,10}

这应该是有效的:

import re
my_str = "ctcO6OgnWRAxLtu+akRCFwM asu.edu zOiV6Wo6nDnUhQkZO4XTySrTRwLMgozM9R/LyQs2r+Pb tarantino.cs.ucsb.edu,128.111.48.123 ssh-rsa 9SMF4U+qJW03Bh1"
my_list = re.findall(r'(([a-zA-Z0-9]+(-[a-zA-Z0-9]+)*\.)+[a-z]{2,10})', my_str)
print [i[0] for i in my_list]

正如Gavin指出的,不应该使用str和{}作为变量名,因为它们是Python中的内置类型。在

相关问题 更多 >