Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的正则表达式_Python_Regex - Fatal编程技术网

Python中的正则表达式

Python中的正则表达式,python,regex,Python,Regex,我正试图从一个ENOMAPI调用构建一个域名列表。我得到了很多信息,需要找到与域名相关的线路,然后将它们连接在一起 从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.

我正试图从一个ENOMAPI调用构建一个域名列表。我得到了很多信息,需要找到与域名相关的线路,然后将它们连接在一起

从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) 
编辑: 每次我看到一个需要正则表达式解决的问题,我都会有一种奇怪的冲动,想尝试在没有正则表达式的情况下解决它。大多数情况下,它比使用正则表达式更有效,我鼓励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

您的表达式中有一个捕获组。文件说:

如果模式中存在一个或多个组,则返回组列表;如果模式有多个组,这将是一个元组列表

这就是为什么只返回捕获组的内容

尝试:

这将返回元组列表:

[('SLD1', 'domain1'), ('TLD1', 'com'), ('SLD2', 'domain2'), ('TLD2', 'org'), ('SLD3', 'domain3'), ('TLD4', 'co.uk'), ('SLD5', 'domain4'), ('TLD5', 'net')]

SLD和TLD的组合取决于您。

这对您很有用,例如

>>> 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']

我不知道你为什么要谈论正则表达式。我的意思是,为什么不运行一个
for
循环呢

这里有一句名言似乎很恰当:

有些人在遇到问题时会想:“我知道,我会用 现在他们有两个问题

另外,我不确定这是什么,所以代码忽略了它。

这里有一种方法:

import re
print map('.'.join,  zip(*[iter(re.findall(r'^(?:S|T)LD\d+=(.*)$', text, re.M))]*2))
# ['domain1.com', 'domain2.org', 'domain3.co.uk', 'domain4.net']

这似乎是您想要的:

domains = re.findall('SLD\d+=(.+)', re.sub(r'\nTLD\d+=', '.', enom))
它假定行已排序,并且SLD始终位于其TLD之前。如果情况并非如此,请在不使用正则表达式的情况下尝试以下稍微详细一点的代码:

d = dict(x.split('=') for x in enom.strip().splitlines())

domains = [
    d[key] + '.' + d.get('T' + key[1:], '') 
    for key in d if key.startswith('SLD')
]

您需要为此使用多行正则表达式。这类似于


只是为了好玩,地图->过滤器->地图:

input = """
SLD1=domain1
TLD1=com
SLD2=domain2
TLD2=org
TLDOverride=1
SLD3=domain3
TLD4=co.uk
SLD5=domain4
TLD5=net
"""

splited = map(lambda x: x.split("="), input.split())
slds = filter(lambda x: x[1][0].startswith('SLD'), enumerate(splited))
print map(lambda x: '.'.join([x[1][1], splited[x[0] + 1][1], ]), slds)

>>> ['domain1.com', 'domain2.org', 'domain3.co.uk', 'domain4.net']

正如其他一些答案所说,这里不需要使用正则表达式。一个简单的
拆分
和一些过滤将很好地完成:

lines = data.split("\n") #assuming data contains your input string
sld, tld = [[x.split("=")[1] for x in lines if x[:3] == t] for t in ("SLD", "TLD")]
result = [x+y for x, y in zip(sld, tld)]

我同意!Pythons的字符串操作功能非常强大,我觉得用正则表达式敲打墙壁通常是不必要的。我很少再使用
import-re
。我认为这是最好的解决方案,因为它是O(n)算法。
data = """SLD1=domain1
TLD1=com
SLD2=domain2
TLD2=org
TLDOverride=1
SLD3=domain3
TLD4=co.uk
SLD5=domain4
TLD5=net
TLDOverride=1"""

domain_seq = re.compile(r"SLD\d=(\w+)\nTLD\d=(\w+)", re.M)
for item in domain_seq.finditer(data):
    domain, tld = item.group(1), item.group(2)
    print "%s.%s" % (domain,tld)
input = """
SLD1=domain1
TLD1=com
SLD2=domain2
TLD2=org
TLDOverride=1
SLD3=domain3
TLD4=co.uk
SLD5=domain4
TLD5=net
"""

splited = map(lambda x: x.split("="), input.split())
slds = filter(lambda x: x[1][0].startswith('SLD'), enumerate(splited))
print map(lambda x: '.'.join([x[1][1], splited[x[0] + 1][1], ]), slds)

>>> ['domain1.com', 'domain2.org', 'domain3.co.uk', 'domain4.net']
lines = data.split("\n") #assuming data contains your input string
sld, tld = [[x.split("=")[1] for x in lines if x[:3] == t] for t in ("SLD", "TLD")]
result = [x+y for x, y in zip(sld, tld)]