Можете ли вы передать словарь при замене строк в Python? - PullRequest
6 голосов
/ 02 июня 2009

В PHP у вас есть preg_replace($patterns, $replacements, $string), где вы можете сделать все свои замены сразу, передав массив шаблонов и замен.

Что такое эквивалент в Python?

Я заметил, что функции string и re replace() и sub() не используют словари ...

Отредактировано для уточнения на основе комментария Рика: Идея состоит в том, чтобы иметь диктовку с ключами, которые будут использоваться в качестве шаблонов регулярных выражений, таких как '\d+S', и (надеюсь) постоянных строковых значений (надеюсь, без обратных ссылок). Теперь измените мой ответ соответственно (то есть, чтобы ответить на фактический вопрос).

Ответы [ 4 ]

10 голосов
/ 02 июня 2009

Ближайшим, вероятно, является:

somere.sub(lambda m: replacements[m.group()], text)

например:

>>> za = re.compile('z\w')
>>> za.sub(lambda m: dict(za='BLU', zo='BLA')[m.group()], 'fa za zo bu')
'fa BLU BLA bu'

с индексом .get вместо [], если вы хотите указать значение по умолчанию для совпадений, отсутствующих в replacements.

Редактировать: на самом деле Рик хочет иметь диктовку с ключами, которые будут использоваться в качестве шаблонов регулярных выражений, таких как '\d+S', и (надеюсь) постоянных строковых значений (надеюсь, без обратных ссылок). Рецепт поваренной книги может быть адаптирован для этой цели:

def dict_sub(d, text): 
  """ Replace in 'text' non-overlapping occurences of REs whose patterns are keys
  in dictionary 'd' by corresponding values (which must be constant strings: may
  have named backreferences but not numeric ones). The keys must not contain
  anonymous matching-groups.
  Returns the new string.""" 

  # Create a regular expression  from the dictionary keys
  regex = re.compile("|".join("(%s)" % k for k in d))
  # Facilitate lookup from group number to value
  lookup = dict((i+1, v) for i, v in enumerate(d.itervalues()))

  # For each match, find which group matched and expand its value
  return regex.sub(lambda mo: mo.expand(lookup[mo.lastindex]), text)

Пример использования:

  d={'\d+S': 'wot', '\d+T': 'zap'}
  t='And 23S, and 45T, and 66T but always 029S!'
  print dict_sub(d, t)

излучает:

And wot, and zap, and zap but always wot!

Вы можете избежать построения lookup и просто использовать mo.expand(d.values()[mo.lastindex-1]), но это может быть немного медленным, если d очень велико и имеется много совпадений (извините, точно не измерены / сравнены оба подхода, поэтому это всего лишь предположение; -).

0 голосов
/ 19 июля 2012

Вы можете передать словарь при замене строки в Python. Рассмотрим приведенный выше пример:

replacement = {'hello' : 'goodbye', 'good' : 'bad' }

вы должны написать строку в этом формате

s = "%(hello)s, %(good)s morning"
changed_s = s%replacement

результат change_s будет

"goodbye, bad morning"
0 голосов
/ 22 июня 2011

Вот простой способ использования

.
mynewstring=reduce(lambda a,(b,c): a.replace(b, c), mydict.items(), mystring)
0 голосов
/ 02 июня 2009

Это достаточно легко сделать:

replacements = dict(hello='goodbye', good='bad')
s = "hello, good morning";
for old, new in replacements.items():
    s = s.replace(old, new)

Вы найдете много мест, где функции PHP принимают массив значений, и нет прямого эквивалента Python, но в Python работать с массивами (списками) намного проще, поэтому это не проблема.

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