2

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) 
4

9 に答える 9

6

編集: 正規表現の解決策を求める質問を見るたびに、正規表現なしで解決しようとする奇妙な衝動に駆られます。ほとんどの場合、正規表現を使用するよりも効率的です。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-26T12:23:23.577 に答える
4

式にキャプチャ グループがあります。re.findallドキュメンテーションは言う:

パターンに 1 つ以上のグループが存在する場合は、グループのリストを返します。パターンに複数のグループがある場合、これはタプルのリストになります。

そのため、キャプチャ グループのコンテンツのみが返されます。

試す:

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 の組み合わせはあなた次第です。

于 2013-05-26T12:23:40.740 に答える
3

これはあなたの例でうまくいきます、

>>> 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-26T12:25:28.983 に答える
3

なぜ正規表現について話しているのかわかりません。つまり、forループを実行してみませんか?

ここでは、有名な引用が適切であるように思われます。

問題に直面したときに、「分かった、正規表現を使用する」と考える人もいます。現在、彼らには 2 つの問題があります。

domains = []
components = []
for line in enom.split('\n'):
  k,v = line.split('=')
  if k == 'TLDOverride':
    continue
  components.append(v)
  if k.startswith('TLD'):
    domains.append('.'.join(components))
    components = []

PSこれが何であるかわからないTLDOverrideので、コードはそれを無視します。

于 2013-05-26T12:25:55.793 に答える
2

1 つの方法を次に示します。

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']
于 2013-05-26T12:30:58.523 に答える
1

これには複数行の正規表現を使用する必要があります。これは、この投稿に似ています。

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)
于 2013-05-26T12:36:53.447 に答える
1

これはあなたが望むことをするようです:

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')
]
于 2013-05-26T12:34:27.390 に答える