2014-12-01 25 views
3

我在將一個.txt文件過濾到子列表中時遇到了一些麻煩,然後我可以將它們變成一個目錄。 來自text.txt的示例
A2.-B4-...C4-.-.D3-..E1.F4..-.G3--.H4....75--...85---..95----.05-----.6.-.-.-,6--..--?6..--..!5..--.
沒有空格或換行符,它基本上是一行文本。
A2.-表示符號'A'在莫爾斯碼中有2個字符,並且它們是.-等。

我想要做的是將這個長字符串拆分爲子列表,然後我可以將它們拼合成一個目錄,然後我可以使用它來製作莫爾斯碼翻譯器。我希望程序做什麼:創建一個列表keyList,其中包含鍵A,B,C,...,?,。,
和另一個列表valueList,其中包含鍵的值。
但是由於密鑰不是全部字母,所以在整個文件中都有問題。
我曾嘗試:
python 3.4將文本文件過濾到列表中

import re 
r = open("text.txt", "r") 
ss = r.read()  
p = re.compile('\w'+'\w') 
keyList = p.findall(ss) 
ValueList = p.split(ss) 
print(keyList) 
print(ValueList) 


keyList = ['A2', 'B4', 'C4', 'D3',..., '75', '85', '95', '05'] 
ValueList = ['', '.-', '-...', '-.-.', '-..', space , !5..--.'] 

所看到的值列表將無法正常分裂,因爲 '\ W' + '\ W' 將只匹配字母數字字符..我試圖改變re.compile上的參數,但沒有找到任何有效的工具。任何幫助?是re.compiled做到這一點的最佳方式還是有另一種方法來過濾文本?

編輯:預期/希望輸出:

keyList = ['A','B','C','D',...,'.','?',','] 
ValueList = ['.-','-...','-.-.','-..',...,'.-.-.-','..--..','--..--'] 
+0

你想要的字母?像'A','B',..?你可以添加預期的輸出問題嗎? – Kasramvd 2014-12-01 17:52:02

+0

是的,這實際上是我想要的,但是該列表不僅包含字母,甚至'。'。有一個莫爾斯密碼是。-.- .-
所以我想''。成爲關鍵和價值'。-。-.-'
kroneckersdelta 2014-12-01 18:23:28

+0

那麼數字呢?它更好地添加慾望輸出! – Kasramvd 2014-12-01 18:24:45

回答

1

爲了使編碼器/解碼器,你可能想使用字典而不是列表。

就解析它而言,直接天真的方法可能是最好的。

result = {} 
with open('morse.txt', 'r') as f:  
    while True:  
     key = f.read(1)             
     length_str = f.read(1)            

     if len(key) != 1 or len(length_str) != 1:       
      break               

     try:                
      length = int(length_str)          
     except ValueError:             
      break               

     value = f.read(length)            

     if len(value) == length:           
      result[key] = value           

for k, v in result.items(): 
    print k, v  

結果:

A .- 
! ..--.                 
C -.-.                  
B -...                  
E .                  
D -..                  
G --.                  
F ..-.                  
H ....                  
, --..--                 
. .-.-.-                 
0 -----                 
7 --...                 
9 ----.                 
8 ---..                 
? ..--.. 
1

您可以通過以下嘗試:

items = re.findall(r'(.\d)([\.-]+)', ss) 
keys = [s[0][0] for s in items] 
values = [s[1] for s in items] 

我:

>>> keys 
['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', '7', '8', '9', '0', ',', '?', '!'] 
values 
['.-', '-...', '-.-.', '-..', '.', '..-.', '--.', '....', '--...', '---..', '----.', '-----.', '--..--', '..--..', '..--.'] 
+0

這比我的回答更簡潔。我想這個長度除了作爲分隔符之外沒有任何用處! – Cuadue 2014-12-01 19:15:10

0

類似Cuadue's answer,我會用一個循環解析這個,但我會做到以相反的順序來代替:

morse_str = 'A2.-B4-...C4-.-.D3-..E1.F4..-.G3--.H4....75--...85---..95----.05-----.6.-.-.-,6--..--?6..--..!5..--.' 
morse_list = list(morse_str) 
morse_dict = {} 
while morse_list: 
    morse = '' 
    while True: 
     sym = morse_list.pop() 
     try: 
      int(sym) 
     except ValueError: 
      morse += sym 
     else: 
      key = morse_list.pop() 
      morse_dict[key] = morse[::-1] 
      break 
0

對於發現你可以在正則表達式使用positive look-ahead鍵:

>>> s = 'A2.-B4-...C4-.-.D3-..E1.F4..-.G3--.H4....75--...85---..95----.05-----.6.-.-.-,6--..--?6..--..!5..--.' 
>>> keys = re.findall(r'[\w|\W](?=\d\W)',s) 
['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', '7', '8', '9', '0', '.', ',', '?', '!'] 

Regular expression visualization

Debuggex Demo

你有沒有字母字符,如!,.在你的鍵和值中,你不能使用突出一個re功能爲獲得期望值,您可以使用該模式與split()函數根據您的密鑰分割字符串,然後您將具有預期值輸出與一個數字在領先,然後刪除該數字與re.sub()

>>> values = [re.sub('\d','',i) for i in re.split(r'[\w|\W](?=\d)',s) if len(i)] 
['.-', '-...', '-.-.', '-..', '.', '..-.', '--.', '...', '--..', '---.', '----', '-----', '.-.-.-', '--..--', '..--..', '..--.'] 

因此,作爲一個重要的事情,你必須爲keys相同lenvalues

>>> len(keys) 
16 
>>> len(values) 
16 

,最後壓縮它們:

>>> dict(zip(keys,values)) 
{'A': '.-', '!': '..--.', 'C': '-.-.', 'B': '-...', 'E': '.', 'D': '-..', 'G': '--.', 'F': '..-.', 'H': '...', ',': '--..--', '.': '.-.-.-', '0': '-----', '7': '--..', '9': '----', '8': '---.', '?': '..--..'}