import re
from functools import partial
text = u'''
'<RoomRatesWithoutServices>&
</RoomRatesWithoutServices>&
<TotalBeforeTaxPayHotel AmountAfterTax="560.00" CurrencyCode="EUR"/>&
<TotalBeforeTaxPayHotel AmountAfterTax="560.00" CurrencyCode="EUR"/>&
<RoomRatesWithoutServices>&
</RoomRatesWithoutServices>&'
'<RoomRatesWithoutServices>&
<TotalBeforeTaxPayHotel AmountAfterTax="560.00" CurrencyCode1="EUR"/>&
<TotalBeforeTaxPayHotel AmountAfterTax="560.00" CurrencyCode2="EUR"/>&
<RoomRatesWithoutServices>&
</RoomRatesWithoutServices>&'
'<RoomRatesWithoutServices>&
</RoomRatesWithoutServices>&
<TotalBeforeTaxPayHotel AmountAfterTax="560.00" CurrencyCode="EUR"/>&
<TotalBeforeTaxPayHotel AmountAfterTax="560.00" CurrencyCode="EUR"/>&
<RoomRatesWithoutServices>&
</RoomRatesWithoutServices>&'
'<AnotherTag>&
<TotalBeforeTaxPayHotel AmountAfterTax="560.00" AnotherAttr="EUR"/>&
<TotalBeforeTaxPayHotel AmountAfterTax="560.00" AnotherAttr="EUR"/>&
<AnotherTag>&
</AnotherTag>&'
'''
sub_dict = {"RoomRatesWithoutServices": ['CurrencyCode1', 'CurrencyCode2'],
"AnotherTag": ['AnotherAttr']}
replacement = '_REPLACED_'
def closure(attr, replacement, m):
attr_pattern = '(?<=(?:%s)=")[^"]+(?=")' % attr
return re.sub(attr_pattern, replacement, m.group())
for ext_tag, attr_list in sub_dict.iteritems():
attr = r"|".join(attr_list)
tag_pattern = r"(?s)<%s>.*?</%s>" % (ext_tag, ext_tag)
text = re.sub(tag_pattern, partial(closure, attr, replacement), text)
print text