Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从文本文件、空格、拆分字母、数字和冒号中提取数据_Python - Fatal编程技术网

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

Python 从文本文件、空格、拆分字母、数字和冒号中提取数据,python,Python,我正在尝试创建一个程序,读取一个txt文件,该文件有1000多行以下格式,并将数据存储在两个独立的二维数组中: b14 b15 b12 y4:y11 r7 y1 b2 r15 y13 y12 b14:g9 r2 b8 b7 该文件存储游戏结果,其中有两名玩家,他们都从一个包中选择四个令牌。上面可以看到的一个示例标记是“b15”,这意味着它是蓝色,上面有数字15。冒号表示之后的代币是给第二名玩家的 每条线都是一个游戏。我需要将每个令牌的颜色和编号存储到4行2列的二维数组中,每个玩家都有一个,例如

我正在尝试创建一个程序,读取一个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

感谢阅读,我很乐意回答任何需要进一步澄清的问题。

如果您已经从文本文件中阅读了您的移动,您可以使用拆分函数和列表切片()来处理它们

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'

从文本文件读入移动后,可以使用split函数和list slicing()来处理它们

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'

可以使用正则表达式拆分字母和数字,str.split()可以拆分两个玩家的结果

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

可以使用正则表达式拆分字母和数字,str.split()可以拆分两个玩家的结果

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.match
str.split
):

输出:

[['b', '14'], ['b', '15'], ['b', '12'], ['y', '4']]
[['y', '11'], ['r', '7'], ['y', '1'], ['b', '2']]
使用以下方法(关键功能是
re.match
str.split
):

输出:

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

请发布相关代码,以便您做出最佳尝试。谢谢。开始学习和练习吧——这可能需要一段时间,但对于字符串中的模式匹配来说,这很有用。你可能想一直使用它。如果您搜索在线正则表达式测试程序,有一些很好的测试程序使用与Python相同的风格。然后,默认情况下,
str.split()
将在空格上拆分,如果指定,则在冒号上拆分-如果标记的颜色始终是一个字符,则可以使用片段
color,number=token[:1],token[1:]
请发布相关代码,以获得最佳尝试。谢谢。开始学习和练习吧——这可能需要一段时间,但对于字符串中的模式匹配来说,这很有用。你可能想一直使用它。如果您搜索在线正则表达式测试程序,有一些很好的测试程序使用与Python相同的风格。然后,默认情况下,
str.split()
将在空格上拆分,如果指定,则在冒号上拆分-如果标记的颜色始终是一个字符,则可以使用片段
color,number=token[:1],token[1:]
谢谢您的回复。既然我注意到上面的“if”语句检查行是否不是空白,它将以什么格式存储在“results”数组中?我如何添加第二个玩家呢?每个玩家的每个令牌之间都会有一个空白。我需要二维数组中的所有4个令牌,以便我能够对它们进行进一步计算。感谢您的回复。既然我注意到上面的“if”语句检查行是否不是空白,它将以什么格式存储在“results”数组中?我如何添加第二个玩家呢?每个玩家的每个令牌之间都会有一个空白。我需要二维数组中的所有4个令牌才能对它们进行进一步计算。对于第二个玩家,它将\n添加到结果数组的末尾,是否有任何方法可以避免包含该字符,或者每次我只需要使用一种方法来删除第二个玩家最后一个数组位置的最后两个字符?下面是它的样子:对于第二个玩家:['b6','y4','g13','b10\n']@bobbyjoe最简单的事情可能是将行更改为:
player1,player2=mstrig.strip().split(“:”)
strip(请参阅)将删除字符串开头/结尾的所有空格(例如“\n”新行字符)。对于第二个播放机,它将\n添加到结果数组的结尾,是否有任何方法可以避免包含该字符,或者每次我只需要使用一种方法来删除第二个玩家最后一个数组位置的最后两个字符?下面是它的样子:对于第二个玩家:['b6','y4','g13','b10\n']@bobbyjoe最简单的事情可能是将行更改为:
player1,player2=mstrig.strip().split(“:”)
strip(请参阅)将删除字符串开头/结尾的所有空格(例如“\n”新行字符)。