我有一个字符串如下
command= "copy1 "D:\path1\program Files" "c:\program Files\path1" copy2 "D:\path2\program Files" "c:\program Files\path2""
请注意,copy1和copy2都在字符串中。我的目的是将每个复制过程写入xml文件,如下所示:
<copyFiles>
<copy1>
<Sourcepath>D:\path1\program Files</Sourcepath>
<DestPath>c:\program Files\path1</DestPath>
</copy1>
<copy2>
<Sourcepath>D:\path2\program Files</Sourcepath>
<DestPath>c:\program Files\path2</DestPath>
</copy2>
<copyFiles>
我试图通过使用空格分割字符串来创建每个参数的列表,如下所示:
Copyparamlist=command.split(' ')
但是我按照以下方式对xml进行了调整:
<copyFiles>
<copy1>
<Sourcepath>D:\path1\program</Sourcepath>
<DestPath>c:\program</DestPath>
</copy1>
<copy2>
<Sourcepath>D:\path2\program</Sourcepath>
<DestPath>c:\program</DestPath>
</copy2>
<copyFiles>
我的清单内容应如下:
["copy1", "D:\path1\program Files", "c:\program Files\path1", "copy2",
"D:\path2\program Files]", "c:\program Files\path2"]
请帮忙
答案 0 :(得分:1)
很难说出你想要的是什么,但看起来你想分割字符串如下:
a = 'this "is a string" with "4 elements"'
split = magic_splitter(a) #How to write magic splitter?
print split #['this', 'is a string', 'with', '4 elements']
如果是这种情况,你想要的是使用奇妙的函数shlex.split
print shlex.split(a) #['this', 'is a string', 'with', '4 elements']
答案 1 :(得分:0)
您想要的输出是什么?您可以使用join
将其放入您想要的任何格式。例如,要简单地删除空格,请使用
Copyparamlist=''.join(command.split(' '))
或者如果您想用%20替换它们,请使用
Copyparamlit='%20'.join(command.split(' '))
答案 2 :(得分:0)
你需要另外一个除空格之外的分隔符...... 例如......你可以使用例如引用分隔符的东西作为
CopyParam = command.split('"')
我应该了解string命令的格式 as copyName“Source”“Destination”... 你可以循环三元组列表...... 像
for i in xrange(0, len(CopyParam), 3):
copyname, sourcepath, destpath = CopyParam[i], CopyParam[i + 1], CopyParam[i + 2]
# Do the code to transfer it to XML here ..
您可能需要先从列表中删除空元素..
答案 3 :(得分:0)
我假设您的命令字符串实际上被指定为;
command='copy1 "something with spaces" "somewhere else" copy2 "this thing" "elsewhere"'
如果您的命令始终是复制命令,可能会查看“复制”一词的拆分并使用结果列表,
command.split('copy')
['','1 "something with spaces" "somewhere else" ','2 "this thing" "elsewhere"']
答案 4 :(得分:0)
我认为这个帖子可能有你想要的东西。如果你试图忽略引号中的分割,你可能不得不使用正则表达式。
How to split but ignore separators in quoted strings, in python?
试试这段代码:
import re
PATTERN = re.compile(r'''((?:[^ "']|"[^"]*"|'[^']*')+)''')
command = PATTERN.split(command)
答案 5 :(得分:0)
有了它,它可以很容易地作为字典管理:
import shlex
split = shlex.split(commandlist)
commands = dict(zip(split[::3], zip(split[1::3], split[2::3])))
说明: 鉴于字符串&#39; copyname&#34; source&#34; &#34; DEST&#34; copyname2&#34; source2&#34; &#34; dest2&#34;&#39; ...
split = shlex.split()将以['copyname', 'source', 'dest', 'copyname2', 'source2','dest2']
split[::3]
正在做一些叫做拼接的事情。这隐含地说&#39;从0指数开始,给我每三个项目。 split[::3]
将等于['copyname', 'copyname2']
。但是,拼接并不止于此。 split[1::3]
表示从索引1开始,然后在此之后给出每个第三个元素。它将返回所有来源。
zip
功能是一个独特的功能。鉴于列表l1=['a','b','c']
和l2=[1,2,3]
,zip(l1,l2)
将等于[('a',1),('b',2), ('c',3)]
。
zip(split[1::3], split[2::3])
将等于[('source', 'dest'), ('source2', 'dest2')]
。
zip(split[::3], zip(split[1::3], split[2::3]))
将等于[('copyname',('source','dest')), ('copyname2',('source2','dest2'))]
。
dict
函数会将给定列表中的每个键/值对(copyname
和('source','dest')
)转换为字典。
commands
变量现在采用{'copyname': ('source', 'dest'), ...}
格式
要写入xml,只需遍历字典即可。
专业提示:当使用for
遍历字典时,每个项目都是一个键。
如果您愿意,可以使用for copyname, source, dest in zip(split[::3], split[1::3], split[2::3])
。
答案 6 :(得分:0)
尝试以下示例:
import shlex
import xml.etree.ElementTree as etree
def my_parser(s):
command = []
for item in shlex.split(s):
if item.startswith('copy'):
if command: # any previous command was collected?
yield command # output one parsed command
command = [ item ] # start collecting new command
else:
command.append(item) # collect another argument
if command: # if anything was collected
yield command # output the last parsed command
cmd = r'copy1 "D:\path1\program Files" "c:\program Files\path1" copy2 "D:\path2\program Files" "c:\program Files\path2"'
# Just to show what are the parsed command in the lists
for command in my_parser(cmd):
print command
# Alternatively, constructing the XML.
e = etree.Element('copyFiles') # root element
tree = etree.ElementTree(e)
root = tree.getroot() # now the same as e
for command in my_parser(cmd):
assert len(command) == 3
assert command[0].startswith('copy')
e = etree.Element(command[0]) # the command name becomes the tag name
src = etree.Element('Sourcepath') # subelement
src.text = command[1]
dst = etree.Element('DestPath') # subelement
dst.text = command[2]
e.append(src) # subelement appended to its parent
e.append(dst) # subelement appended to its parent
root.append(e) # command appended to the root element
tree.write('output.xml')
打印:
['copy1', 'D:\\path1\\program Files', 'c:\\program Files\\path1']
['copy2', 'D:\\path2\\program Files', 'c:\\program Files\\path2']
并生成output.xml
,其中包含以下内容(作为一行,在此处手动换行):
<copyFiles><copy1><Sourcepath>D:\path1\program Files</Sourcepath>
<DestPath>c:\program Files\path1</DestPath></copy1>
<copy2><Sourcepath>D:\path2\program Files</Sourcepath>
<DestPath>c:\program Files\path2</DestPath></copy2></copyFiles>