2016-03-30 5 views
1

У меня есть на следующие выражения:Замена нескольких подобных строк

a = 'x11 + x111 + x1111 + x1' 

, и я хотел бы заменить следующее:

from_ = ['1', '11', '111', '1111'] 
to = ['2', '22', '333', '3333'] 

и, следовательно, получаем следующий результат:

anew = 'x22 + x333 + x3333 + x2' 

Как я могу это сделать с помощью Python?

Это похоже на вопрос: Python replace multiple strings. Однако в моем случае заменяемые значения перезаписываются сами по себе, если я использую предложенных андерсеров в вопросе. Следовательно, в metioned link результат 'x22 + x222 + x2222 + x2'

ответ

1

re.sub из библиотеки re (regex) можно использовать, когда вам нужно делать многозначные замены.

re.sub принимает дополнительный аргумент функции, в этой функции вы можете внести необходимые изменения. Из документации

re.sub(pattern, repl, string, count=0, flags=0) 

Если repl является функцией, она вызывается для каждого непересекающихся появления рисунка. Функция принимает объект с одним совпадением аргумент и возвращает заменяемая строка.

(курсив мой)

Регулярное выражение здесь просто, то есть, \d+, который подразумевает, что вы согласования всех групп цифр.

Вы можете использовать следующий фрагмент кода, чтобы получить ваш требуемого выходного

import re 

a = 'x11 + x111 + x1111 + x1' 

def substitute(matched_obj): 
    from_ = ['1', '11', '111', '1111'] 
    to = ['2', '22', '333', '3333'] 
    part = matched_obj.group(0) 
    if part in from_: 
     return to[from_.index(part)] 
    return part 

anew = re.sub(r'\d+',substitute,a) 

После выполнения программы значение anew будет x22 + x333 + x3333 + x2 что ожидаемый ответ. `

+0

Thanks @wim для редактирования –

+0

Нет проблем. Существует режим сбоя, который вы не учли, о котором я хочу упомянуть, рассмотрим вход 'a = 'x12'', вывод должен быть« x22 », но из-за жадного регулярного выражения вы получаете вывод'' x12 ' ' – wim

+0

@wim Спасибо, что упомянули. Я постараюсь сделать это как можно скорее. (В течение 24 часов, не может сделать это банкомат, поскольку я уже на кровати 315AM). Еще раз спасибо. –

Смежные вопросы