2016-07-28 4 views
2

Ich versuche, ein Python-Skript zu schreiben, ziehen Sie alle Google Cloud Compute-Subnetze aus ihrem DNS. Mehr Informationen zu dieser hier:Hostnamen aus einer einzelnen Textzeile mit Regex ziehen

https://cloud.google.com/compute/docs/faq#where_can_i_find_short_product_name_ip_ranges

Bisher bin ich in der Lage, die TXT-Eintrag Liste der einzelnen Host-Namen als basestring ohne Probleme ziehen.

import dns.resolver 

# Set the resolver 
my_resolver = dns.resolver.Resolver() 
my_resolver.nameservers = ['8.8.8.8'] 

answer = my_resolver.query('_cloud-netblocks.googleusercontent.com', 'TXT') 

for rdata in answer: 
    for txt_string in rdata.strings: 
     txt_record = txt_string 

Dies läßt mich mit einer Reihe von

v=spf1 include:_cloud-netblocks1.googleusercontent.com include:_cloud-netblocks2.googleusercontent.com include:_cloud-netblocks3.googleusercontent.com include:_cloud-netblocks4.googleusercontent.com include:_cloud-netblocks5.googleusercontent.com ?all 

Was würde ich tun möchte, ist die Verwendung re.match die 5 Host-Namen aus dieser ersten Antwort zu extrahieren, damit ich in Folge Lookups tun kann, und Streifen aus Die Subnetze ordnen sie dann in ein Array ein. Alle meine Bemühungen mit Regex waren bisher nicht so ... großartig ... Ich fragte mich, ob irgendjemand eine Anleitung geben würde? Vielen Dank!

Edit:

Hier ist die vollständige Skript für alle anderen mit einem Bedarf alle Google-Cloud-IPs zu sammeln.

import dns.resolver, re 

# Set the resolver 
my_resolver = dns.resolver.Resolver() 
my_resolver.nameservers = ['8.8.8.8'] 

answer = my_resolver.query('_cloud-netblocks.googleusercontent.com', 'TXT') 

for rdata in answer: 
    for txt_string in rdata.strings: 
     txt_record = txt_string 

# Extract hostnames into array 
hostnames = [x.split(":")[1] for x in txt_record.split() if ":" in x] 
total_subnets = [] 

for host in hostnames: 
    answer = my_resolver.query(host, 'TXT') 

    for rdata in answer: 
     for txt_string in rdata.strings: 
      txt_record = txt_string 

    ip4_subnets = re.findall(r'ip4:(\S+)', txt_record) 
    ip6_subnets = re.findall(r'ip6:(\S+)', txt_record) 

    for subnet in ip4_subnets: 
     total_subnets.append(subnet) 

    for subnet in ip6_subnets: 
     total_subnets.append(subnet) 

print total_subnets 

Antwort

1

Sie brauchen nicht einen regulären Ausdruck für diese zu verwenden, benutzen Sie split zweimal und Verständnis:

s = "v=spf1 include:_cloud-netblocks1.googleusercontent.com include:_cloud-netblocks2.googleusercontent.com include:_cloud-netblocks3.googleusercontent.com include:_cloud-netblocks4.googleusercontent.com include:_cloud-netblocks5.googleusercontent.com ?all" 
print([x.split(":")[1] for x in s.split() if ":" in x]) 
# => ['_cloud-netblocks1.googleusercontent.com', 
#  '_cloud-netblocks2.googleusercontent.com', 
#  '_cloud-netblocks3.googleusercontent.com', 
#  '_cloud-netblocks4.googleusercontent.com', 
#  '_cloud-netblocks5.googleusercontent.com'] 

Siehe demo here

Einzelheiten:

  • s.split() - spaltet mit Leerzeichen
  • if ":" in x - wird nur die Einträge mit einem : innerhalb
  • x.split(":")[1] - teilt die oben Einträge mit : und erhält den zweiten Brocken

Sicher, wenn Sie möchten, können Sie einen regulären Ausdruck verwenden:

include:(\S+) 

Siehe demo.

Dies entspricht include: und wird 1 + non-whitespace Symbole in Gruppe 1 erfassen. re.findall holt Sie die Liste (re.findall(r'include:(\S+)', s)).

+1

Ausgezeichnet! Hat super funktioniert! Vielen Dank! – user2421173

Verwandte Themen