python - 在Python中用正则表达式替换多个字符串,以获取截断字符串的文件

标签 python regex xml elementtree

以下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

返回修改后的行字符串,其中在找到第一个匹配项的地方截断一些行

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

编辑:

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

import xml.etree.cElementTree as ET
import time

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

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

for elem in doc.iterfind('//*'):
    if 'OrderName' in elem.attrib:
        elem.attrib['OrderName'] = ts   
    if 'OrderNo' in elem.attrib:
        elem.attrib['OrderNo'] = ts
    if 'ShipmentNo' in elem.attrib:
        elem.attrib['ShipmentNo'] = ts
    if 'TrackingNo' in elem.attrib:
        elem.attrib['TrackingNo'] = ts
    if 'WaveKey' in elem.attrib:
        elem.attrib['WaveKey'] = ts


doc.write('singleoutbound_2.xml')

最佳答案

以下是如何使用 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 属性的所有元素。
  • 尝试使用字符串替换和正则表达式等不正确的工具修改文档树将导致代码更加复杂且难以维护。您将遇到完全有效的输入(您的正则表达式没有特殊情况)的运行时错误、字符编码问题和仅当有人查看您的程序输出时才会捕获的静默错误。换句话说:这是错误的做法,所以不要这样做。
  • 上面的代码实际上比您的代码更简单,更容易推理和扩展。

关于python - 在Python中用正则表达式替换多个字符串,以获取截断字符串的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39126870/

相关文章:

regex - 在 Linux 文件名中替换双引号以及其他无效的 Windows 文件名字符

java - 正则表达式用于检查单词中的重复字母并防止输入字符或符号

python - 使用正则表达式反向搜索

Android 的 XMLPullParser getAttributeValue 正在从字符串中删除前导零

java - 使用 Maven 进行 XML/XSL 压缩

java - Jasper 报告中的评估异常

python - ffmpeg:使用脚本获取持续时间:无法为 '2>&1 | grep "持续时间找到合适的输出格式“”

python - 是什么决定文件应该是应用程序/八位字节流还是文本/纯文本?

python - 理解 python 中的 lambda 并使用它来传递多个参数

python - Celery 任务完成后未释放 Redis 连接