Можете ли вы передать словарь при замене строк в Python?
в PHP, у вас есть preg_replace($patterns, $replacements, $string)
, где вы можете сделать все ваши замены сразу, передав массив шаблонов и замен.
что эквивалентно в Python?
Я заметил, что функции string и re replace()
и sub()
Не берите словари...
отредактировано для уточнения на основе комментария Рика:
идея состоит в том, чтобы иметь дикт с ключами, которые будут приняты как шаблоны регулярных выражений, такие как 'd+S'
, и (надеюсь) постоянная строка значения (надеюсь, без обратных ссылок). Теперь редактировать мой ответ соответственно (т. е. ответить на актуальный вопрос).
4 ответов
ближайший является, вероятно:
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
.
Edit: на самом деле Рик хочет иметь дикт с ключами, которые будут приняты как шаблоны регулярных выражений, такие как '\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
очень большой, и есть много матчей (извините, не точно измерили/сопоставили оба подхода, так что это просто догадка;-).
вот простой способ использования reduce
mynewstring=reduce(lambda a,(b,c): a.replace(b, c), mydict.items(), mystring)
Это достаточно легко сделать это:
replacements = dict(hello='goodbye', good='bad')
s = "hello, good morning";
for old, new in replacements.items():
s = s.replace(old, new)
вы найдете много мест, где функции PHP принимают массив значений и нет прямого эквивалента Python, но гораздо проще работать с массивами (списками) в Python, поэтому это меньше проблем.
вы можете передать словарь при замене строки в python. Рассмотрим приведенный выше пример:
replacement = {'hello' : 'goodbye', 'good' : 'bad' }
вы должны написать строку в этом формате
s = "%(hello)s, %(good)s morning"
changed_s = s%replacement
выход changed_s будет
"goodbye, bad morning"