在替换是搜索关键字/标签的功能的情况下,如何进行正则表达式替换

时间:2019-06-12 13:38:26

标签: python regex

我想在Python中进行正则表达式替换,其中替换是标记后缀的功能

假设我有一个文本(或XML),可以在其中定义自己要替换的标签。这是文本示例:

  <del:DeliveryFormat>A</del:
  <del:ReadingStartDate>%%%NOW@0@%Y-%m-%dT%H:%M:%SZ%%%</del:ReadingStartDate>
  <del:SpSla />
  <del:RecordPosition>1</del:RecordPosition>
  <del:Values>
    <del:Value position="1" registrationDate="2019-02-01T05:09:11.000+00:00" requestedReadingDate="%%%NOW@-1@%Y-%m-%dT%H:%M:%SZ%%%" reading="126.0" status="10" meterReadingId="677947381" />
  </del:Values>

请注意:我可以自由选择标签格式,而我只是选择了“ %%%”

请注意这两个(实际上是更多)不同的标签:

"%%%NOW@0@%Y-%m-%dT%H:%M:%SZ%%%"我想用现在减去0天的日期替换它,并使其格式为Y-%m-%dT%H:%M:%SZ

"%%%NOW@-1@%Y-%m-%dT%H:%M:%SZ%%%"我想用现在的日期减去1天替换它,并使其格式为Y-%m-%dT%H:%M:%SZ

格式可能每次都不同,因此必须使用表单标签本身

此操作仅是通用标签(%%% NOW)的开始和结束部分(%%%)的开始。标签的后缀应该灵活,我想有一个逻辑(函数)来定义如何根据该后缀替换它。

我没有任何要显示的代码-当然,我已经轻松创建了如何用特定格式的日期时间替换%%%NOW%%%。但是如何使替换值和格式成为标签后缀的功能-我不知道:(

当然,我可以通过循环/替换%%%NOW@0@%Y-%m-%dT%H:%M:%SZ, %%%NOW@-1@%Y-%m-%dT%H:%M:%SZ, %%%NOW@-2@%Y-%m-%dT%H:%M:%SZ,等多个搜索(包括不同格式的字符串)来解决此问题。但这可以用一些聪明的美女来完成吗?

1 个答案:

答案 0 :(得分:0)

这是我解决的方法:

output_file_as_string = re.sub("%%%([a-zA-Z]+)@(.?\\d)@([^>]*)%%%", lambda match: Helpers.add_step_to_time(NOW,"day",int(match.group(2))).strftime(match.group(3)), input_file_as_string)
#input_file_as_string = <del:ReadingStartDate>%%%NOW@-2@%Y-%m-%dT%H:%M:%S+01Z%%%</del:ReadingStartDate>
#output_file_as_string = <del:ReadingStartDate>2019-06-11T12:20:47+01Z</del:ReadingStartDate>

其中“ add_step_to_time”是我的代码中已经存在的函数。