我希望使用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我希望输出为:
asu.edu , tarantino.cs.ucsb.edu 但我得到的是:
[('asu.', ''), ('ucsb.', '')]我错过了什么?
发布于 2016-02-07 05:29:46
这应该是可行的:
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]正如加文指出的那样,您不应该使用str和list作为变量名,因为它们是Python语言中的内置类型。
发布于 2016-02-07 05:31:26
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,模式(-[a-zA-Z0-9]+)*\.是不必要的。text中没有文字-,因此(-[a-zA-Z0-9]+)* 永远不会匹配text中的任何。当然,如果愿意,您可以将(?:-[a-zA-Z0-9]+)*添加到模式中(请注意非捕获组(?:...)的使用),但是您发布的text不会执行该模式的这一部分。然而,它将允许您将名称与假设进行匹配:在73中: re.findall(r'(?:a-zA-Z0-9+(?:-a-zA-Z0-9+)*.)+a-z{2,10}','asu-psu.edu,但不像-psu-asu.edu') Out73:'asu-psu.edu','psu-asu.edu‘
和Aprillion noted一样:
在74: re.findall(r'(?:a-zA-Z0-9+(?:-a-zA-Z0-9+)*.)+a-z{2,10}',text) 'tarantino.cs.ucsb.edu'
(?:[a-zA-Z0-9]+\.)+[a-z]{2,10}模式的解释请参见Out74 regex101
https://stackoverflow.com/questions/35246583
复制相似问题