python 3.4将文本文件过滤到列表中

python 3.4将文本文件过滤到列表中,python,Python,我在将.txt文件过滤到子列表中时遇到了一些问题,然后我可以将其转换为目录。 文本.txtA2.-B4-…C4-…D3-…E1.F4-…G3--.H4…75--…85--…95--.05--.6--,6--?6--。。!5.。没有空格或换行符,它基本上是一行文本。A2。-意味着符号“a”在莫尔斯电码中有两个字符,它们是。-,等等我想做的是将这个长字符串拆分为子列表,然后我可以将其压缩到一个目录中,然后我可以使用它来制作莫尔斯电码转换器。我想让程序做的是:制作一个包含键a、B、C、、、、、、、、的

我在将.txt文件过滤到子列表中时遇到了一些问题,然后我可以将其转换为目录。 文本.txt
A2.-B4-…C4-…D3-…E1.F4-…G3--.H4…75--…85--…95--.05--.6--,6--?6--。。!5.。

没有空格或换行符,它基本上是一行文本。
A2。-意味着符号“a”在莫尔斯电码中有两个字符,它们是。-,等等

我想做的是将这个长字符串拆分为子列表,然后我可以将其压缩到一个目录中,然后我可以使用它来制作莫尔斯电码转换器。我想让程序做的是:制作一个包含键a、B、C、、、、、、、、
的列表keyList,以及另一个包含键值的列表valueList。
但是,由于键不全是字母,我在过滤整个文件时遇到了问题
我尝试过的:

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)

如图所示,值列表将无法正确拆分,因为“\w”+“\w”将只匹配字母数字字符。。我尝试过在re.compile上更改参数,但没有找到任何有效的方法。有什么帮助吗?重新编译是最好的方法,还是有其他方法可以过滤文本

编辑:预期/想要的输出:

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

要制作编码器/解码器,您可能需要使用字典而不是列表

就解析它而言,这里最好采用直接的简单方法

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 ---..                                                                   
? ..--..

您可以尝试以下方法:

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
['.-', '-...', '-.-.', '-..', '.', '..-.', '--.', '....', '--...', '---..', '----.', '-----.', '--..--', '..--..', '..--.']
与之类似,我将使用一个循环来解析它,但我将以相反的顺序进行:

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

要查找可在正则表达式中使用的键,请执行以下操作:

>>> 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', '.', ',', '?', '!']

因为您没有像
这样的字母字符
,.
在键和值中,您不能使用jut one
re
函数来获取期望值,您可以使用该模式和
split()
函数根据键拆分字符串,这样您就可以输出期望值,只需在前导添加一个数字,然后用
re.sub()
删除该数字:

因此,重要的是,对于
,必须使用相同的
len

>>> len(keys)
16
>>> len(values)
16
最后给他们拉上拉链:

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

你只想要这些信吗?像
A
B
?您能否将预期输出添加到问题中?是的,这基本上就是我想要的,但是列表中不仅包含字母,甚至“.”还有一个摩尔斯电码是。-。-。-。--
,所以我希望“.”也是一个带有值的键。“-.-.-”
那么数字呢?最好添加欲望输出!这比我的回答要简洁得多。我猜长度除了作为定界符之外没有任何作用!
>>> len(keys)
16
>>> len(values)
16
>>> dict(zip(keys,values))
{'A': '.-', '!': '..--.', 'C': '-.-.', 'B': '-...', 'E': '.', 'D': '-..', 'G': '--.', 'F': '..-.', 'H': '...', ',': '--..--', '.': '.-.-.-', '0': '-----', '7': '--..', '9': '----', '8': '---.', '?': '..--..'}