1

私はアセンブラープログラムに取り組んでいて、CではなくPythonを使用することを選択しました(主にPythonがリストで実行できることと、それを学びたかったためです)

私の質問は、テキストファイルの各行をタプルの一部に分割するにはどうすればよいですか?

たとえば、テストファイルは次のとおりです。

ADD R1,R2;  
OR R1,R3;

これに解析するためのコードがあります

UserProgram=[['ADD','R1','R2'],['OR','R1','R3']]

また、セミコロンの後のコメントも無視する必要があります。ありがとう!

4

5 に答える 5

2
>>> s = "ADD R1,R2; OR R1,R3;"
>>> t1 = s.split(';')
>>> t1
['ADD R1,R2', ' OR R1,R3', '']
>>> UserProgram = [t.strip().replace(',', ' ').split(' ') for t in t1 if len(t) > 0]
>>> UserProgram
[['ADD', 'R1', 'R2'], ['OR', 'R1', 'R3']]
>>> 

ちなみに、角括弧はタプルではなくリストを表します。

于 2012-04-09T06:05:05.593 に答える
1

ソースがこの形式の場合

source="""
ADD R1,R2;
OR R1,R3;
"""

次に、splitlines() を介してソースを単純に線形に分割し;、区切り文字として「;」の後のものを破棄して再度分割することができます。

sourcelines=[x.split(";")[0].replace(',',' ').split() 
             for x in source.splitlines() if x]
[['ADD', 'R1', 'R2'], ['OR', 'R1', 'R3']]

また、先に進んで、各 ASM ソース行を OP コードおよび個々のオペランドとして分割することもできます。

[[token.split(',') for token in x.split(";")[0].split()] 
  for x in source.splitlines() if x]

あなたは次のようなものを得るでしょう

[[['ADD'], ['R1', 'R2']], [['OR'], ['R1', 'R3']]]
于 2012-04-09T06:16:18.890 に答える
1
>>> import re
>>> [re.split('\W+', s.strip()) for s in 'ADD R1,R2; OR R1,R3;'.split(';') if s]
[['ADD', 'R1', 'R2'], ['OR', 'R1', 'R3']]

更新:

python -m timeit -s "import re; regexp = re.compile('\W+');" "[regexp.split(s.strip()) for s in 'ADD R1,R2; OR R1,R3;'.split(';') if s]"
100000 loops, best of 3: 3.34 usec per loop

python -m timeit "[t.strip().replace(',', ' ').split(' ') for t in 'ADD R1,R2; OR R1,R3;'.split(';') if t]"100000 loops, best of 3: 2.1 usec per loop

ところで、私のバリアントは悪くありませんが、少し遅くなります

于 2012-04-09T06:09:09.817 に答える
1

そのため、その形式のソース ファイルがあります。

ファイルの各行のトークンのリストが必要です。

トークンは、最初のセミコロンの後のすべてを切り落とし、残りをコンマまたは空白で分割した結果です。コンマをスペースに置き換えてから、空白で分割するだけでこれを行うことができます。

そこで、標準ライブラリに目を向けます。split分割するものを指定しない場合、文字列のメソッドは空白で分割されます。このreplaceメソッドを使用すると、ある部分文字列を別の部分文字列に置き換えることができます (たとえば、',') ' '。セミコロンの後のすべてを削除するにはpartition、最初の部分 (結果の要素 0) を取ります。* 個々の行の処理は次のようになります。

line.partition(';')[0].replace(',', ' ').split()

そして、ファイルの各行に対してこれを行うだけです。ソースの要素に何らかの関数を適用した結果のリストを取得するには、リスト内包表記を使用して直接要求できます (基本的に、結果のリストがどのように見えるかを記述します)。Python のファイル オブジェクトは、行の有効なソースです。それを繰り返し処理することができ (この概念はおそらく C++ プログラマーにはなじみ深いものです)、要素はファイルの行です。

したがって、必要なことは、ファイルを開き (慣用的にwithブロックを使用してファイルを管理します)、リストを生成することだけです。

with open('asm.s') as source:
    parsed = [
        line.partition(';')[0].replace(',', ' ').split()
        for line in source
    ]

終わり。

* またはsplitもう一度使用しますが、要素のリストを作成することが実際の目標ではない場合、これはあまり明確ではありません。

于 2012-04-10T00:00:37.907 に答える
0
>>>s = "ADD R1,R2; OR R1,R3;"
>>>[substr.split() for substr in s.replace(',',' ').split(';')[:-1]]
[['ADD', 'R1', 'R2'], ['OR', 'R1', 'R3']]
于 2012-04-09T06:55:22.767 に答える