LINUX.ORG.RU

Оптимизация скрипта

 ,


1

2

Доброе утро! Есть задача, я её выполнил, но смотрю на это и не понимаю, как это можно улучшить. Задача простая — получаю некий текст и мне его нужно последовательно обработать несколькими регулярками. Все эти последовательности я разбил на функции, вот такой пример:

def one(text):
    text = re.sub(r'in1', r'out1', text)
    text = re.sub(r'in2', r'out2', text)
    return text


def two(text):
    text = re.sub(r'in3', r'out3', text)
    text = re.sub(r'in4', r'out4', text)
    return text


def three(text):
    text = re.sub(r'in5', r'out5', text)
    text = re.sub(r'in6', r'out6', text)
    return text


def make_magic(text):
    text = one(text)
    text = two(text)
    text = three(text)
    return text
заметно, что выглядит это совсем не очень. Я подумывал сделать класс, как описано здесь, но что-то ничего не получилось. Так же не получилось хотя бы в кучку собрать (in, out), чтобы паттерны как-то циклом подставлять.

Собственно, как это можно улучшить?

Ответ на: комментарий от conformist

sub((tuple), text)

Так распаковывать надо с помощью *. И text после этого передать как именованный аргумент, иначе будет синтаксическая ошибка.

Как-то так должно выйти:

for i in [(r'in1', 'out1')]:
    text = re.sub(*i, string=text)
Kilte ★★★★★ ()

Учитывая, что шаблоны регулярных выражений не содержат никакого синтаксиса, характерного для регэкспов, можно вообще обойтись string.replace:

>>> text='abcd'
>>> arg=[('a','1'),('b','2'),('c','3'),('d','4')]
>>> reduce(lambda t, (i, o): t.replace(i, o), arg, text) # Python 2 only!
'1234'
>>> 

Virtuos86 ★★★★★ ()

выглядит это совсем не очень

Почему? Дубово, без вычурных конструкций. Зато легко понять, прочитав заново спустя годы.

Собственно, как это можно улучшить?

Если одна и та же регулярка используется много раз в скрипте, стоит разделить компиляцию и использование.

i-rinat ★★★★★ ()
Ответ на: комментарий от conformist

r'in5', r'out5'

Отсюда. Эти строки, конечно, являются валидными регулярными выражениями, но примерно так же, как медведь является человеком, потому что у него есть две руки, две ноги, и он может ходить и даже ездить на велосипеде, если научат.

Virtuos86 ★★★★★ ()