Множественные, специфические, регулярные замены в 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.