用','替换换行符和XML标签

1 投票
4 回答
2105 浏览
提问于 2025-04-16 09:08

我有一个看起来像这样的XML文档:

  <file>
    <name>NAME_OF_FILE</name>
  </file>
  <file>
    <name>NAME_OF_FILE</name>
  </file>

我想写一个Python脚本,把所有的换行符、标签和标签之间的空白(也就是说,不包括元素本身)都替换成逗号“,”。

上面的文件输出应该是这样的:

NAME_OF_FILE','NAME_OF_FILE','NAME_OF_FILE','

这是我目前写的代码。我对Python是怎么处理换行符的有点困惑:

import sys
import os
import re

source = r'c:\A\grepper.txt'

f = open(source,'r')
out = open(r'c:\A\bout.txt', 'a')

for line in f:
    one = re.sub(r"\n", '', line)
    two = re.sub(r"\r", '', one)
    three = re.sub(r'</name>.*<name>', '\',\'', two)
    out.write(three)

out.close()

4 个回答

0

正则表达式不适合这个情况。你应该使用 xml.sax.handler 这个模块。

这个代码还没有经过测试:

import xml.sax
from xml.sax.handler import ContentHandler

class CharactersOnlyContentHandler(ContentHandler):
    def __init__(self):
        ContentHandler.__init__(self)
        self.text = ""
        self.texts = []

    def characters(self, content):
        self.text += content

    def endElement(self, name):
        if self.text:
            self.texts.append(self.text)
            self.text = ""

handler = CharactersOnlyContentHandler()
xml.sax.parse(xml_file_name, handler)
print ",".join("'%s'" % s for s in handler.texts)
0

与其直接替换,不如考虑一下你想要匹配的内容:

tag_re = re.compile('''
    <(?P<tag>[a-z]+)> # First match the tag, must be a-z enclosed in <>
    (?P<value>[^<>]+) # Match the value, anything but <>
    </(?P=tag)> # Match the same tag we got earlier, but the closing version
''', re.VERBOSE)
print "','".join(m.group('value') for m in tag_re.finditer(data))
2

去掉这些r,因为它们会把字符串当作字面意思来处理。

one = re.sub("\n", '', line)
two = re.sub("\r", '', one)

你也可以用string.replace()来做这些简单的替换,而且可以把它们合并成一行。

line = re.sub('r</name>.*<name>', "','", line.replace('\n', '').replace('\r', ''))
out.write(line)

不过,这样还是不能解决你想要的输出问题。我建议你可以这样做:

results = []
for line in f:
    match = re.search(r'<name>(.*)</name>', line)
    if match:
        results.append(match.group(1))
print >>out, "','".join(results)

这是它工作的样子:http://ideone.com/ik48G

撰写回答