从文本文件中提取数据、空格、拆分字母、数字和冒号

2024-04-27 05:00:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图创建一个程序,读取一个txt文件,该文件有1000多行以下格式,并将数据存储在两个独立的二维数组中:

b14 b15 b12 y4:y11 r7 y1 b2
r15 y13 y12 b14:g9 r2 b8 b7

该文件存储了一个游戏的结果,其中有两个玩家,他们都从一个包中选择了四个令牌。上面可以看到的一个标记示例是“b15”,这意味着它是蓝色的,上面有数字15。冒号表示之后的代币是给第二个玩家的。你知道吗

每一行都是一个游戏。我需要将每个令牌的颜色和编号存储到4行2列的二维数组中,每个玩家都有一个

player1[0][0] = 'b'
player1[0][1] = 14
player1[1][0] = 'b'
player1[1][1] = 15

这将为玩家1存储前两个令牌,在我为单个游戏(文本文件中的单行)将此玩家和第二个玩家的其余令牌存储在单独的二维数组中之后,我将处理数据,然后再次为文本文件中的下一行(游戏)覆盖数组。你知道吗

我的主要问题是如何做到以下几点:

  • 将字母和数字分开,这样我就可以将它们存储在不同的数组位置
  • 识别一个空白意味着一个新的标记
  • 认识到冒号意味着玩家的代币都被选中了,接下来是玩家2。你知道吗

感谢阅读,我很高兴回答任何问题,以进一步澄清。你知道吗


Tags: 文件数据标记程序txt游戏玩家数字
3条回答

你可以用正则表达式把字母和数字分开,结构拆分()平分两名选手的成绩

import re

for line in file(yourfilename):
    line = line.strip()
    if line != '':#not white space
        results = line.split(':')#results[0] is the first man's result,results[1] is the second man's result
        result1 = results[0].split(' ')
        player1 = []
        for i in range(4):
            grade = re.findall(r'([a-z]+)([0-9]+)', result1[i])
            player1.append([grade[0][0],grade[0][1]])#Split the letter and number
        #player2 is the same as player1

使用以下方法(关键函数是re.matchstr.split):

import re

# str represents the line form text file
str = 'b14 b15 b12 y4:y11 r7 y1 b2'
player1, player2 = [[list(re.match('^([a-z])(\d+)$', i).groups()) for i in player.split(' ')]
                    for player in str.split(':')
                    ]

print(player1, player2, sep='\n')

输出:

[['b', '14'], ['b', '15'], ['b', '12'], ['y', '4']]
[['y', '11'], ['r', '7'], ['y', '1'], ['b', '2']]

如果从文本文件中读入了移动,可以使用split函数和列表切片(Explain Python's slice notation)来处理它们。你知道吗

>>> mystring = 'b14 b15 b12 y4:y11 r7 y1 b2'

在冒号处分开,让玩家1/付款人2移动:

>>> player1, player2 = mystring.split(':')

对于每个玩家,在空格处拆分以获得移动:

>>> player1_moves = player1.split(' ')
>>> player1_moves
['b14', 'b15', 'b12', 'y4']

如果您知道移动的第一部分总是正好是一个字母,则可以“切掉”字符串的第一部分:

>>> player1_moves[0][:1]
'b'
>>> player1_moves[0][1:]
'14'

相关问题 更多 >