поиск и замена текста в файле в Python - PullRequest
0 голосов
/ 20 августа 2010

Я пытаюсь преобразовать файл, который содержит IP-адрес в традиционном формате, в файл, который содержит IP-адрес в двоичном формате.

Содержимое файла выглядит следующим образом.

src-ip {192.168.64.54}
dst-ip {192.168.43.87}


У меня следующий код:

import re
from decimal import *

filter = open("filter.txt", "r")

output = open("format.txt", "w")

for line in filter:
        bytePattern = "([01]?\d\d?|2[0-4]\d|25[0-5])"
        regObj = re.compile("\.".join([bytePattern]*4))
        for match in regObj.finditer(line):
            m1,m2,m3,m4 = match.groups()
            line = line.replace((' '.join([bin(256 + int(x))[3:] for x in '123.123.123.123'.split('.')])),bytePattern)
            print line

Часть line.replace() делаетКажется, не работает нормально.Первый параметр в строке .replace работает нормально (т.е. он конвертирует IP-адрес в двоичный формат), но line.replace, похоже, не работает.Любая помощь или подсказки, почему это происходит, приветствуется.

Ответы [ 4 ]

2 голосов
/ 20 августа 2010
with open('filter.txt') as filter_:
    with open("format.txt", "w") as format: 
        for line in filter_:
            if line != '\n':
                ip = line.split()
                ip[1] = '.'.join(bin(int(x)+256)[3:] for x in ip[1].split('.'))
                ip[4]= '.'.join(bin(int(x)+256)[3:] for x in ip[4].split('.'))
                ip = " ".join(ip) + '\n'
                format.write(ip)
1 голос
/ 20 августа 2010

Почему бы не использовать вместо этого re.sub(), чтобы облегчить замену и упростить регулярное выражение?

import re
from decimal import *

filter = open("filter.txt", "r")

output = open("format.txt", "w")

pattern = re.compile(r'[\d.]+') # Matches any sequence of digits and .'s

def convert_match_to_binary(match)
    octets = match.group(0).split('.')
    # do something here to convert the octets to a string you want to replace
    # this IP with, and store it in new_form
    return new_form

for line in filter:
    line = pattern.sub(convert_match_to_binary, line)
    print line
0 голосов
/ 20 августа 2010

Если вам нужна помощь, это мой старый код от DaniWed Преобразование IP-номера между строкой из числа точек и целым числом с добавленной проверкой ошибок.

def ipnumber(ip): 
    if ip.count('.') != 3: 
        raise ValueError, 'IP string with wrong number of dots' 
    ip=[int(ipn) for ipn in ip.rstrip().split('.')]
    if any(ipn<0 or ipn>255 for ipn in ip):
        raise ValueError, 'IP part of wrong value: %s' % ip
    ipn=0 
    while ip: 
        ipn=(ipn<<8)+ip.pop(0)
    return ipn 

def ipstring(ip): 
    ips='' 
    for i in range(4): 
        ip,n=divmod(ip,256)
        print n
        if (n<0) or (n>255): 
            raise ValueError, "IP number %i is not valid (%s, %i)." % (ip,ips,n) 
        ips = str(n)+'.'+ips 
    return ips[:-1] ## take out extra point

inp = "src-ip{ 192.168.64.544 } dst-ip{ 192.168.43.87 }"

found=' '
while found:
    _,found,ip = inp.partition('-ip{ ')
    ip,found,inp = ip.partition(' }')
    if ip:
         print ipnumber(ip)
0 голосов
/ 20 августа 2010

Ваш код очень странный:

line = line.replace(
    (' '.join([bin(256 + int(x))[3:] for x in '123.123.123.123'.split('.')])),
    bytePattern
    )

Первый аргумент - это константа, которая оценивается как '01111011 01111011 01111011 01111011', а bytePattern является регулярным выражением "([01]? \ D \ d?| 2 [0-4] \ d | 25 [0-5]) ", так что это действительно так:

line = line.replace('01111011 01111011 01111011 01111011', "([01]?\d\d?|2[0-4]\d|25[0-5])")

Это ничего не даст, если в вашем файле нет 01111011 01111011 01111011 01111011 вЭто.

Метод .replace () заменяет только литеральные строки, а не регулярные выражения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...