2012-04-09 104 views
1

進出口工作在一個彙編程序,並選擇使用Python在C(主要是因爲什麼Python可以用列表做,我想了解它)分割線成的一部分元組的Python

我的問題是如何將文本文件的每一行分割成一個元組的一部分?

如測試文件是:

ADD R1,R2; 
OR R1,R3; 

,並有代碼來解析成這個

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

它也將忽略分號後的意見。謝謝!

+0

從C背景的,巨蟒似乎有點陌生。可以預見的是,我嘗試使用for循環來分割列表的每個元素(單行)。我也嘗試了多個分隔符分割,但無法運行。在此之前我必須做的程序是一個5階段流水線架構模擬器。希望我更好地瞭解Python,因爲它看起來會讓自己變得更好。 – 2012-04-09 16:04:18

回答

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

順便說一句,方括號表示列表,而不是元組。

+3

列出,更準確。 – 2012-04-09 06:58:05

+0

啊,是的!謝謝@ Li-aungYip。 – 2012-04-09 07:03:01

+0

這很好,我明白爲什麼。謝謝! – 2012-04-09 16:04:41

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 

BTW我的變種也不錯,雖然有點慢

+0

爲什麼要使用're.split'來獲取沒有參數的'str.split'的默認行爲?這也不要求你先「剝去」()該字符串。 – 2012-04-10 00:05:08

+0

不,'string.split'只會分割空格,而不是逗號。在分割之前,你都會'替換(',','')',但我建議使用正則表達式執行另一個實現 – San4ez 2012-04-10 05:44:06

1

如果你的來源是這種格式

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

那麼你就可以只需通過拆分線()拆分線性源,然後再用拆分作爲分隔符丟棄';'後的任何內容

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

您也可以繼續前進,分裂每個ASM源代碼行操作碼和操作數個人。

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

你會得到這樣的事情

[[['ADD'], ['R1', 'R2']], [['OR'], ['R1', 'R3']]] 
0
>>>s = "ADD R1,R2; OR R1,R3;" 
>>>[substr.split() for substr in s.replace(',',' ').split(';')[:-1]] 
[['ADD', 'R1', 'R2'], ['OR', 'R1', 'R3']] 
+0

裝配註釋從行的第一個分號開始,而不是最後一個;你應該在這裏使用'[0]'而不是'[:-1]'。 – 2012-04-10 00:06:41

+0

@Karl Knechtel ??? – ChessMaster 2012-04-10 06:00:24

+0

當你在第一個分號之前分隔';'時,就是你真正想要的。在你的例子中,'OR R1,R3;'實際上是一個註釋,因爲它出現在';'之後。 Python中的';'=='#',所以你需要一個換行符。 – 2012-07-25 13:52:21

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,但我覺得這是不太清楚時,它實際上不是你的目標是生產要素的列表。