我正在开发一个汇编程序并选择使用Python而不是C(主要是因为Python可以用列表做什么,我想学习它)
我的问题是如何将文本文件的每一行拆分为元组的一部分?
例如,测试文件是:
ADD R1,R2;
OR R1,R3;
并有代码将其解析为此
UserProgram=[['ADD','R1','R2'],['OR','R1','R3']]
分号后也必须忽略注释。谢谢!
答案 0 :(得分: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']]
>>>
顺便说一句,方括号表示列表,而不是元组。
答案 1 :(得分: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']]
<强> UPD:强>
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
顺便说一句,我的变体并不坏,虽然有点慢
答案 2 :(得分: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']]]
答案 3 :(得分: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
,但我发现当生成元素列表实际上不是你的目标时,这一点就不太清楚了。
答案 4 :(得分:0)
>>>s = "ADD R1,R2; OR R1,R3;"
>>>[substr.split() for substr in s.replace(',',' ').split(';')[:-1]]
[['ADD', 'R1', 'R2'], ['OR', 'R1', 'R3']]