fork download
  1. import re
  2. from functools import partial
  3.  
  4. text = u'''
  5. '<RoomRatesWithoutServices>&
  6. </RoomRatesWithoutServices>&
  7. <TotalBeforeTaxPayHotel AmountAfterTax="560.00" CurrencyCode="EUR"/>&
  8. <TotalBeforeTaxPayHotel AmountAfterTax="560.00" CurrencyCode="EUR"/>&
  9. <RoomRatesWithoutServices>&
  10. </RoomRatesWithoutServices>&'
  11.  
  12. '<RoomRatesWithoutServices>&
  13. <TotalBeforeTaxPayHotel AmountAfterTax="560.00" CurrencyCode1="EUR"/>&
  14. <TotalBeforeTaxPayHotel AmountAfterTax="560.00" CurrencyCode2="EUR"/>&
  15. <RoomRatesWithoutServices>&
  16. </RoomRatesWithoutServices>&'
  17.  
  18. '<RoomRatesWithoutServices>&
  19. </RoomRatesWithoutServices>&
  20. <TotalBeforeTaxPayHotel AmountAfterTax="560.00" CurrencyCode="EUR"/>&
  21. <TotalBeforeTaxPayHotel AmountAfterTax="560.00" CurrencyCode="EUR"/>&
  22. <RoomRatesWithoutServices>&
  23. </RoomRatesWithoutServices>&'
  24.  
  25. '<AnotherTag>&
  26. <TotalBeforeTaxPayHotel AmountAfterTax="560.00" AnotherAttr="EUR"/>&
  27. <TotalBeforeTaxPayHotel AmountAfterTax="560.00" AnotherAttr="EUR"/>&
  28. <AnotherTag>&
  29. </AnotherTag>&'
  30.  
  31. '''
  32.  
  33. sub_dict = {"RoomRatesWithoutServices": ['CurrencyCode1', 'CurrencyCode2'],
  34. "AnotherTag": ['AnotherAttr']}
  35.  
  36. replacement = '_REPLACED_'
  37.  
  38.  
  39. def closure(attr, replacement, m):
  40. attr_pattern = '(?<=(?:%s)=")[^"]+(?=")' % attr
  41. return re.sub(attr_pattern, replacement, m.group())
  42.  
  43. for ext_tag, attr_list in sub_dict.iteritems():
  44. attr = r"|".join(attr_list)
  45. tag_pattern = r"(?s)<%s>.*?</%s>" % (ext_tag, ext_tag)
  46. text = re.sub(tag_pattern, partial(closure, attr, replacement), text)
  47.  
  48. print text
  49.  
Success #stdin #stdout 0.02s 9016KB
stdin
Standard input is empty
stdout
'<RoomRatesWithoutServices>&
  </RoomRatesWithoutServices>&
  <TotalBeforeTaxPayHotel AmountAfterTax="560.00" CurrencyCode="EUR"/>&
  <TotalBeforeTaxPayHotel AmountAfterTax="560.00" CurrencyCode="EUR"/>&
  <RoomRatesWithoutServices>&
</RoomRatesWithoutServices>&'

'<RoomRatesWithoutServices>&
  <TotalBeforeTaxPayHotel AmountAfterTax="560.00" CurrencyCode1="_REPLACED_"/>&
  <TotalBeforeTaxPayHotel AmountAfterTax="560.00" CurrencyCode2="_REPLACED_"/>&
  <RoomRatesWithoutServices>&
</RoomRatesWithoutServices>&'

'<RoomRatesWithoutServices>&
  </RoomRatesWithoutServices>&
  <TotalBeforeTaxPayHotel AmountAfterTax="560.00" CurrencyCode="EUR"/>&
  <TotalBeforeTaxPayHotel AmountAfterTax="560.00" CurrencyCode="EUR"/>&
  <RoomRatesWithoutServices>&
</RoomRatesWithoutServices>&'

'<AnotherTag>&
  <TotalBeforeTaxPayHotel AmountAfterTax="560.00" AnotherAttr="_REPLACED_"/>&
  <TotalBeforeTaxPayHotel AmountAfterTax="560.00" AnotherAttr="_REPLACED_"/>&
  <AnotherTag>&
</AnotherTag>&'