Множественные, специфические, регулярные замены в Python

То, что я хотел бы сделать, это сделать конкретные замены в данном тексте. Например, "<" следует изменить на "[", ">" на "]" и т. Д. Это похоже на решение, приведенное здесь: Как я могу сделать несколько подстановок, используя регулярное выражение в Python?, который

import re 

def multiple_replace(dict, text):
  # Create a regular expression  from the dictionary keys
  regex = re.compile("(%s)" % "|".join(map(re.escape, dict.keys())))

  # For each match, look-up corresponding value in dictionary
  return regex.sub(lambda mo: dict[mo.string[mo.start():mo.end()]], text) 

Теперь проблема в том, что я также хотел бы заменить шаблоны с регулярным выражением. Например, я хочу заменить "fo.+" На "foo" и "ba[rz]*" на "bar".

Удаление карты (re.escape в коде помогает, так что регулярное выражение действительно совпадает, но я затем получаю ключевые ошибки, потому что, например, 'barzzzzzz' будет совпадением, и что-то, что я хочу заменить, но 'barzzzzzz' не является ключом в словаре, буквальная строка 'ba[rz]*' есть. Как я могу изменить эту функцию для работы?

(На несвязанной ноте, откуда берутся эти "foo" и "bar"?)

2 ответа

Решение
import re

def multiple_replace(dict, text):
  # Create a regular expression  from the dictionary keys
  regex = re.compile(r'(%s)' % "|".join(dict.keys()))
  return regex.sub(lambda mo: dict[
      [ k for k in dict if
      re.search(k, mo.string[mo.start():mo.end()])
      ][0]], text)

d = { r'ba[rz]*' : 'bar', '<' : '[' }
s = 'barzzzzzz <'

print multiple_replace(d, s)

дает:

bar [

Просто сделайте несколько sub звонки.

На несвязанной ноте, Jargon File на помощь: метасинтаксические переменные, foo.

Другие вопросы по тегам