我正在尝试从Enom API调用构建一个域名列表。我得到了很多信息,需要找到与域名相关的行,然后将它们连接在一起。
从Enom返回的字符串看起来有点像这样:
SLD1=domain1
TLD1=com
SLD2=domain2
TLD2=org
TLDOverride=1
SLD3=domain3
TLD4=co.uk
SLD5=domain4
TLD5=net
TLDOverride=1我想创建一个列表,如下所示:
[domain1.com, domain2.org, domain3.co.uk, domain4.net]为了找到不同的域名组件,我尝试了以下命令(其中"enom“是上面的字符串),但只能获得SLD和TLD匹配。
re.findall("^.*(SLD|TLD).*$", enom, re.M) 发布于 2013-05-26 20:25:29
这适用于您的示例,
>>> sld_list = re.findall("^.*SLD[0-9]*?=(.*?)$", enom, re.M)
>>> tld_list = re.findall("^.*TLD[0-9]*?=(.*?)$", enom, re.M)
>>> map(lambda x: x[0] + '.' + x[1], zip(sld_list, tld_list))
['domain1.com', 'domain2.org', 'domain3.co.uk', 'domain4.net']发布于 2013-05-26 20:23:24
编辑:每当我看到一个问题需要正则表达式解决方案时,我就有一种奇怪的冲动,想尝试在没有正则表达式的情况下解决它。在大多数情况下,它比使用正则表达式更有效,我鼓励OP测试哪种解决方案是最有效的。
以下是一种天真的方法:
a = """SLD1=domain1
TLD1=com
SLD2=domain2
TLD2=org
TLDOverride=1
SLD3=domain3
TLD4=co.uk
SLD5=domain4
TLD5=net
TLDOverride=1"""
b = a.split("\n")
c = [x.split("=")[1] for x in b if x != 'TLDOverride=1']
for x in range(0,len(c),2):
print ".".join(c[x:x+2])
>> domain1.com
>> domain2.org
>> domain3.co.uk
>> domain4.net发布于 2013-05-26 20:23:41
您的表达式中有一个捕获组。re.findall文档中写道:
如果模式中存在一个或多个组,则返回一个组列表;如果模式有多个组,这将是一个元组列表。
这就是为什么只返回捕获组的内容的原因。
尝试:
re.findall("^.*((?:SLD|TLD)\d*)=(.*)$", enom, re.M)这将返回一个元组列表:
[('SLD1', 'domain1'), ('TLD1', 'com'), ('SLD2', 'domain2'), ('TLD2', 'org'), ('SLD3', 'domain3'), ('TLD4', 'co.uk'), ('SLD5', 'domain4'), ('TLD5', 'net')]然后,组合SLD和TLD就取决于您了。
https://stackoverflow.com/questions/16759128
复制相似问题