2016-09-02 6 views
0

Я пытаюсь извлечь IP-адрес из asp файла в Python, файл выглядит примерно так:Извлечение IP-адрес из файла

onInternalNet = (
     isInNet(hostDNS, "147.163.1.0", "255.255.0.0") || 
     isInNet(hostDNS, "123.264.0.0", "255.255.0.0") || 
     isInNet(hostDNS, "137.5.0.0", "255.0.0.0") || 
     isInNet(hostDNS, "100.01.02.0", "255.0.0.0") || 
     isInNet(hostDNS, "172.146.30.0", "255.240.0.0") || 
     isInNet(hostDNS, "112.268.0.0", "255.255.0.0") || 

Как я пытаюсь извлечь их это с регулярным выражением :

if re.compile(r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$", line): 

Однако я получаю сообщение об ошибке:

Traceback (most recent call last): 
    File "pull_proxy.py", line 27, in <module> 
    write_to_file(extract_proxies(in_file), out_file) 
    File "pull_proxy.py", line 8, in extract_proxies 
    if re.compile(r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$", line): 
    File "C:\Python27\lib\re.py", line 194, in compile 
    return _compile(pattern, flags) 
    File "C:\Python27\lib\re.py", line 233, in _compile 
    bypass_cache = flags & DEBUG 
TypeError: unsupported operand type(s) for &: 'str' and 'int' 

Я не понимаю, почему я получаю g что ошибка, что я могу сделать с этим кодом, чтобы он извлекал информацию, как я этого хочу?

import re 

def extract_proxies(in_file): 
    buffer = [] 

    for line in in_file: 
     if re.compile(r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$", line): 
      print "{} appened to buffer.".format(line) 
      buffer.append(line) 
     else: 
      pass 

    return buffer 

def write_to_file(buffer, out_file): 
    for proxy in buffer: 
     with open(out_file, "a+") as res: 
      res.write(proxy) 

if __name__ == '__main__': 
    print "Running...." 
    in_file = "C:/Users/thomas_j_perkins/Downloads/test.asp" 
    out_file = "c:/users/thomas_j_perkins/Downloads/results.txt" 
    write_to_file(extract_proxies(in_file), out_file) 

EDIT

Реализованный я не открыл файл:

import re 

def extract_proxies(in_file): 
    buffer = [] 

    for line in in_file: 
     if re.compile(r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$", line): 
      print "{} appened to buffer.".format(line) 
      buffer.append(line) 
     else: 
      pass 

    in_file.close() 
    return buffer 

def write_to_file(buffer, out_file): 
    for proxy in buffer: 
     with open(out_file, "a+") as res: 
      res.write(proxy) 

if __name__ == '__main__': 
    print "Running...." 
    in_file = "C:/Users/thomas_j_perkins/Downloads/PAC-Global-Vista.asp" 
    out_file = "c:/users/thomas_j_perkins/Downloads/results.txt" 
    write_to_file(extract_proxies(open(in_file, "r+")), out_file) 

все еще получаю ту же ошибку:

Running.... 
Traceback (most recent call last): 
    File "pull_proxy.py", line 28, in <module> 
    write_to_file(extract_proxies(open(in_file)), out_file) 
    File "pull_proxy.py", line 8, in extract_proxies 
    if re.compile(r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$", line): 
    File "C:\Python27\lib\re.py", line 194, in compile 
    return _compile(pattern, flags) 
    File "C:\Python27\lib\re.py", line 233, in _compile 
    bypass_cache = flags & DEBUG 
TypeError: unsupported operand type(s) for &: 'str' and 'int' 
+2

Вы никогда не открыть файл. Вы просто зацикливаете строку in_file. – eandersson

+0

@eandersson Ha, я только что отредактировал это в вопросе –

+0

как насчет отказа от регулярных выражений и просто разделить его по пространству? – karlosss

ответ

1

Пожалуйста, проверьте код ниже:

ли пара изменений

  1. re.compile - Regex должны быть выполнены первым, а затем может быть использован с ' матч/поиск/FindAll.
  2. Regex не подходит. При написании регулярного выражения нам нужно рассмотреть с начала строки. Regex не соответствовал словам между линиями напрямую.

import re 


    def extract_proxies(in_file): 
     buffer1 = [] 
     #Regex compiled here 
     m = re.compile(r'\s*\w+\(\w+,\s+\"(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\"') 

     for line in in_file: 
      #Used here to match 
      r = m.match(line) 
      if r is not None: 
       print "{} appened to buffer.".format(line) 
       buffer1.append(r.group(1)) 
      else: 
       pass 

     in_file.close() 
     return buffer1 


    def write_to_file(buffer1, out_file): 
     for proxy in buffer1: 
      with open(out_file, "a+") as res: 
       res.write(proxy+'\n') 


    if __name__ == '__main__': 
     print "Running...." 
     in_file = "sample.txt" 
     out_file = "results.txt" 
     write_to_file(extract_proxies(open(in_file)), out_file) 

Выход:

C:\Users\dinesh_pundkar\Desktop>python c.py 
Running.... 
     isInNet(hostDNS, "147.163.1.0", "255.255.0.0") || 
appened to buffer. 
     isInNet(hostDNS, "123.264.0.0", "255.255.0.0") || 
appened to buffer. 
     isInNet(hostDNS, "137.5.0.0", "255.0.0.0") || 
appened to buffer. 
     isInNet(hostDNS, "100.01.02.0", "255.0.0.0") || 
appened to buffer. 
     isInNet(hostDNS, "172.146.30.0", "255.240.0.0") || 
appened to buffer. 
     isInNet(hostDNS, "112.268.0.0", "255.255.0.0") || appened to buffer. 

C:\Users\dinesh_pundkar\Desktop>python c.py 
+0

Регулярное выражение было правильным, но 'match' соответствует только всей строке ввода, тогда как поиск будет искать подгонку. – sberry

+0

Ни поиск, ни поиск не должны учитывать начало строки. – tdelaney

+0

Это сработало отлично, спасибо. –

2

re.compile ожидавшую соответствующий параметр flags (целое число) из которых line (строка) нет.

Вы должны делать re.match не re.compile:

re.compile

Compile a regular expression pattern into a regular expression object, which can be used for matching using its match() and search() methods...

+0

Я изменил его и получил ту же ошибку –

+0

@ YoYoYoI'mAwesome Изменил его на 're.match (..., line)'? –

1

Вашей начальной ошибки

TypeError: unsupported operand type(s) for &: 'str' and 'int' 

вызваны именно то, что сказало @Moses в своем ответе. флаги должны быть значениями int, а не строками.


Вы должны скомпилировать свое регулярное выражение один раз. Кроме того, вам нужно использовать дескриптор открытого файла, когда вы перебираете строки.

импорта вновь

IP_MATCHER = re.compile(r"(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})") 

def extract_proxies(fh): 
    for line in fh: 
     line = line.strip() 
     match = IP_MATCHER.findall(line) 
     if match: 
      print "{} appened to buffer.".format(line) 
      print match 
     else: 
      pass 



def write_to_file(buffer, out_file): 
    for proxy in buffer: 
     with open(out_file, "a+") as res: 
      res.write(proxy) 


if __name__ == '__main__': 
    print "Running...." 
    in_file = "in.txt" 
    with open(in_file) as fh: 
     extract_proxies(fh) 

Найдет все матчи, если вы хотите только первое, а затем использовать IP_MATCHER.search и match.groups(). Это, конечно, предполагает, что вы действительно хотите извлечь IP-адреса.

Например:

def extract_proxies(fh): 
    for line in fh: 
     line = line.strip() 
     match = IP_MATCHER.findall(line) 
     if len(match) == 2: 
      print "{} appened to buffer.".format(line) 
      ip, mask = match 
      print "IP: %s => Mask: %s" % (ip, mask) 
     else: 
      pass