用','替换换行符和XML标签
我有一个看起来像这样的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