1

次のような文字列があります

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"]

助けてください

4

7 に答える 7

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']
于 2012-07-26T15:01:12.313 に答える
0

スペース以外の別の区切り文字が必要です...たとえば...たとえば、引用符を使用して区切り文字を使用できます。

CopyParam = command.split('"')

そして、文字列コマンドの形式を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 ..

最初にリストから空の要素を削除する必要があるかもしれません。

于 2012-07-26T15:01:49.160 に答える
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されます(ここでは手動でラップされた1行として):

<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>
于 2012-07-26T16:26:32.493 に答える
0

このスレッドには、あなたが探しているものがあるかもしれないと思います。引用符で囲まれた分割を無視しようとしている場合は、おそらく正規表現を使用する必要があります。

Pythonで、引用符で囲まれた文字列の区切り記号を分割して無視する方法は?

このコードを試してください:

import re
PATTERN = re.compile(r'''((?:[^ "']|"[^"]*"|'[^']*')+)''')
command = PATTERN.split(command)
于 2012-07-26T15:12:47.957 に答える
0

これにより、辞書として簡単に管理できます。

import shlex
split = shlex.split(commandlist)
commands = dict(zip(split[::3], zip(split[1::3], split[2::3])))

説明: 文字列 'copyname "source" "dest" copyname2 "source2" "dest2"' を指定すると...

split = shlex.split() は、文字列を次の形式で分割します['copyname', 'source', 'dest', 'copyname2', 'source2','dest2']

split[::3]スプライシングと呼ばれるものをやっています。これは暗黙のうちに、「インデックス 0 から始めて、3 つおきのアイテムをください」と言っています。split[::3]となり['copyname', 'copyname2']ます。ただし、スプライシングはそれだけではありません。split[1::3]インデックス 1 から開始し、その後は 3 つおきの要素を指定します。すべてのソースが返されます。

機能は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])

于 2012-07-26T15:13:08.683 に答える
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"']
于 2012-07-26T15:02:57.290 に答える
0

あなたが望む出力は何ですか?使用joinして、任意の形式で配置できます。たとえば、スペースを単純に削除するには、次を使用します。

Copyparamlist=''.join(command.split(' '))

または、それらを %20 に置き換えたい場合は、使用します

Copyparamlit='%20'.join(command.split(' '))
于 2012-07-26T14:56:05.343 に答える