在python中将多个字符串替换为给定截断字符串的文件的regex

2024-09-27 23:20:15 发布

您现在位置:Python中文网/ 问答频道 /正文

下面的python代码

import xml.etree.cElementTree as ET
import time
import fileinput
import re

ts = str(int(time.time()))
modifiedline =''
for line in fileinput.input("singleoutbound.xml"):
    line = re.sub('OrderName=".*"','OrderName="'+ts+'"', line)
    line = re.sub('OrderNo=".*"','OrderNo="'+ts+'"', line)

    line = re.sub('ShipmentNo=".*"','ShipmentNo="'+ts+'"', line)

    line = re.sub('TrackingNo=".*"','TrackingNo="'+ts+'"', line)

    line = re.sub('WaveKey=".*"','WaveKey="'+ts+'"', line)
    modifiedline=modifiedline+line

返回modifiedline字符串,在找到第一个匹配项的地方截断某些行

如何确保它为每一行返回完整的字符串?在

编辑:

我改变了我解决这个问题的方式,受到托马拉克的启发

^{pr2}$

Tags: 字符串代码importretimelinexmlts
2条回答

以下是如何使用ElementTree修改XML文件,而不会意外破坏它:

import xml.etree.cElementTree as ET
import time

ts = str(int(time.time()))

doc = ET.parse('singleoutbound.xml')

for elem in doc.iterfind('//*[@OrderName]'):
    elem.attrib['OrderName'] = ts

# and so on

doc.write('singleoutbound_2.xml')

需要了解的事项:

  • XML表示由元素、属性和值等组成的树形数据结构。将其视为基于行的纯文本无法识别这一事实。在
  • 有一种语言可以从数据树中选择项,称为XPath。它很强大,而且不难学。学习它。我已经使用上面的//*[@OrderName]来查找具有OrderName属性的所有元素。在
  • 尝试使用不适当的工具(如字符串替换和正则表达式)修改文档树将导致代码更加复杂和难以维护。对于正则表达式没有特殊情况的完全有效输入,您将遇到运行时错误、字符编码问题和静默错误,这些错误只有在有人查看程序输出时才会被捕获。换言之:这样做是错误的,所以不要这样做。在
  • 上面的代码实际上比您的代码更简单,更容易推理和扩展。在

如果没有重要原因,请不要使用regex解析XML

*进行贪婪匹配,但实际上您似乎想要的是*?,因为直到行中的最后一个"而下一个"才匹配。在

因此,只需将cone中的每个*替换为*?,这样就可以了(除了常见的do not regex-XML问题)。在

编辑:

Regex和XML的常见问题是,您的Regex一开始工作得很好,但对于来自其他来源(例如其他导出器或甚至同一导出器的其他版本)的有效XML无效,因为在XML中表达相同内容的方式不同。例如,<name att="123"></name><name att="123"/><name att='123' />相同,这与用123&;引号括起来的相同,这可能与<a:name att="123"/>或{}相同,具体取决于命名空间的使用。在

短:

实际上,当无法控制的内容发生变化时,您无法确定正则表达式是否仍然有效。在

但是:

  • 在这种情况下,一些解析器也可能产生意外的结果
  • 一些导出程序生成的XML不好,而普通解析器无法正确理解这些XML,因此,如果无法修复这些问题,则需要使用regex等解决方法。在

相关问题 更多 >

    热门问题