Использование метода sub () с python - PullRequest
0 голосов
/ 29 января 2019

Я хотел бы заменить текст в файле с помощью регулярных выражений и Python.Используя sed, я могу сделать что-то подобное в командной строке

sed -r 's/([0-9]{1,3}\.)([0-9]{1,3}\.)([0-9]{1,3}\.)([0-9]{1,3})/\1\2xx.xx/' ./input/my_file > ./output/my_file_new

, которая в основном ищет строку ip = [4 октета] и заменяет последние два на xx.

Входной файл будет выглядеть как

name=rockband&ip=176.4.23.71&releasedate=none
name=rockband2&ip=121.1.44.52&releasedate=none

Нужный выходной файл выглядит как

name=rockband&ip=176.4.xx.xx&releasedate=none
name=rockband2&ip=121.1.xx.xx&releasedate=none

Мне нужно поместить это в скрипт Python, который я использую

import re
regexp = re.compile(r's/([0-9]{1,3}\.)([0-9]{1,3}\.)([0-9]{1,3}\.)([0-9]{1,3})/\1\2xx.xx/')

def replace(source_file_path):
fh, target_file_path = mkstemp()

with codecs.open(target_file_path, 'w', 'utf-8') as target_file:
    with codecs.open(source_file_path, 'r', 'utf-8') as source_file:
        for line in source_file:
            print(line)
            target_file.write( !! How to use sub in here )
remove(source_file_path)
move(target_file_path, source_file_path)

Как я могу использовать метод sub() для достижения того, что я хочу сделать?Мне нужно передать 3 аргумента этому методу, и я могу думать только о том, как передать 2, я не знаю, каким должен быть этот третий аргумент

target_file.write(re.sub(regexp, line))

1 Ответ

0 голосов
/ 29 января 2019

Минимальное требуемое изменение вашего кода будет:

import re
regexp = re.compile(r'([0-9]{1,3}\.)([0-9]{1,3}\.)([0-9]{1,3}\.)([0-9]{1,3})')

def replace(source_file_path):
    fh, target_file_path = mkstemp()

    with codecs.open(target_file_path, 'w', 'utf-8') as target_file:
        with codecs.open(source_file_path, 'r', 'utf-8') as source_file:
            for line in source_file:
                print(line)
                target_file.write(regexp.sub(r'\1\2xx.xx', line))
    remove(source_file_path)
    move(target_file_path, source_file_path)

regexp определяет только то, что соответствует.sub() имеет аргумент того, что заменить.

Вы можете также вызвать re.sub(), который принимает три обязательных аргумента: что сопоставить, чем его заменить, какую строкуработа над.Или, как в приведенном выше примере, когда у вас уже есть предварительно скомпилированное регулярное выражение, вы можете использовать его метод sub(), в этом случае нужно указать, что заменить, и какую строку использовать.

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