2014-12-01 52 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': '---.', '?': '..--..'}