我想在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,
等多个搜索(包括不同格式的字符串)来解决此问题。但这可以用一些聪明的美女来完成吗?
答案 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”是我的代码中已经存在的函数。